西安电子科技大学2017年ACM-ICPC校赛

2019-04-13 14:13发布

2017 Xidian Programming Contest  Onsite

#include #include #include #include #include #include #include #include #include #include #include #define mod 998244353 #define INF 0x3f3f3f3f #define eps 1e-5 #define ll long long using namespace std; const int maxn=1e6; int main(){ int T; scanf("%d",&T); while(T--){ int n; scanf("%d",&n); ll sum=0; for(int i=0;i #include #include #include #include #include #include #include #include #include #include #include #define mod 998244353 #define INF 0x3f3f3f3f #define eps 1e-5 #define long long LL using namespace std; const int maxn=1e3+10; int a[maxn]; int b[maxn]; int cnt[maxn*10]; bool vis[maxn*10]; int main(){ int n; scanf("%d",&n); memset(cnt,0,sizeof cnt); memset(vis,0,sizeof vis); for(int i=0;i s; s.clear(); for(int i=0;i v; for(int i=0;i=MAX) v.push_back(i); int len=v.size(); for(int i=0;i   //poj 3468 #include #include #define __int64 long long using namespace std; const int N = 1e5+10; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 __int64 sum[N<<2],add[N<<2]; struct Node { int l,r; int mid() { return (l+r)>>1; } } tree[N<<2]; void PushUp(int rt) { sum[rt] = sum[rt<<1] + sum[rt<<1|1]; } void PushDown(int rt,int m) { if(add[rt]) { add[rt<<1] += add[rt]; add[rt<<1|1] += add[rt]; sum[rt<<1] += add[rt] * (m - (m>>1)); sum[rt<<1|1] += add[rt] * (m>>1); add[rt] = 0; } } void build(int l,int r,int rt) { tree[rt].l = l; tree[rt].r = r; add[rt] = 0; if(l == r) { sum[rt]=0; return ; } int m = tree[rt].mid(); build(lson); build(rson); PushUp(rt); } void update(int c,int l,int r,int rt) { if(tree[rt].l == l && r == tree[rt].r) { add[rt] += c; sum[rt] += (__int64)c * (r-l+1); return; } if(tree[rt].l == tree[rt].r) return; PushDown(rt,tree[rt].r - tree[rt].l + 1); int m = tree[rt].mid(); if(r <= m) update(c,l,r,rt<<1); else if(l > m) update(c,l,r,rt<<1|1); else { update(c,l,m,rt<<1); update(c,m+1,r,rt<<1|1); } PushUp(rt); } __int64 query(int l,int r,int rt) { if(l == tree[rt].l && r == tree[rt].r) { return sum[rt]; } PushDown(rt,tree[rt].r - tree[rt].l + 1); int m = tree[rt].mid(); __int64 res = 0; if(r <= m) res += query(l,r,rt<<1); else if(l > m) res += query(l,r,rt<<1|1); else { res += query(l,m,rt<<1); res += query(m+1,r,rt<<1|1); } return res; } int main() { int n,m; while(~scanf("%d %d",&n,&m)) { build(1,n,1); for(int i=1;i<=m;i++) { int x; scanf("%d",&x); update(1,1,x,1); } for(int i=1;i<=n;i++) printf("%lld ",query(i,i,1)); } return 0; } #include #include #include using namespace std; typedef struct { int x; int y; } square; square sq[1010]; int n; bool find1(int a,int b) { for(int i=0;i 答案显然和R、G、B的数量有关
  1. 对于R>n,必然有两个两个R处于同一列
  2. 对于2<R<=n,用构造法可以证明是可以的
  3. 对于R=2,只有【R,G】或者【R,B】(B和G不能同时存在)两种显然是可以,R必须用一条斜线将B和G划分为两个区域,显然G,B都是奇数
  4. 对于R<2,只有【R,G】或者【R,B】(B和G不能同时存在)两种显然是可以
#include #include #include #include #include #include #include #include #include #include #include #define mod 998244353 #define INF 0x3f3f3f3f #define eps 1e-5 #define long long LL using namespace std; const int maxn=1e4+10; char str[2][maxn]; int main(){ int T; scanf("%d",&T); while(T--){ int n; scanf("%d",&n); scanf("%s%s",str[0],str[1]); /* if(n==1){ if(str[0][0]=='R'&&str[1][0]=='R'|| str[0][0]=='G'&&str[1][0]=='B'|| str[0][0]=='B'&&str[1][0]=='G') printf("NO "); else printf("YES "); continue; } */ //统计个数 int R=0,G=0,B=0; for(int i=0;in,必然有两个R相邻 if(R>n){ printf("NO "); continue; } //用构造法可以证明 if(R>2&&R<=n){ printf("YES "); continue; } //R=2,只有【R,G】或者【R,B】两种显然是可以的 //R必须用一条斜线将B和G划分为两个区域,显然G,B都是奇数 if(R==2){ if(G==0||B==0||(G&1)&&(B&1)) printf("YES "); else printf("NO "); continue; } //R=0,显然只有B或者G //R=1,显然只有B或者G if(R<2){ if(G&&B) printf("NO "); else printf("YES "); continue; } } return 0; } //I #include using namespace std; const int maxn=1e5+10; typedef pair p; bool cmp(p a,p b){ return a.second s; //set::iterator it; for(int i=0;i