吐槽:比赛刚开始codeblocks出了点问题。。边看题边弄编译器。。。囧。。
D居然一直没看。。因为E题意好懂。。然后sb地卡了一场E。。。战斗力太不稳定。。。
A...
A
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #define N 100010 5 using namespace std; 6 int ans[N][2]; 7 int main(){ 8 int x,y,a,b; 9 while(cin>>x>>y>>a>>b){ 10 int cnt=0; 11 for(int i=a;i<=x;i++){ 12 for(int j=b;j<i&&j<=y;j++){ 13 ans[++cnt][0]=i; 14 ans[cnt][1]=j; 15 } 16 } 17 cout<<cnt<<endl; 18 for(int i=1;i<=cnt;i++) 19 cout<<ans[i][0]<<" "<<ans[i][1]<<endl; 20 } 21 return 0; 22 }
B....
B
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #define N 100010 5 using namespace std; 6 struct S{ 7 int l,r,len,id; 8 }s[N]; 9 bool cmp(S a,S b){ 10 return a.len>b.len; 11 } 12 int main(){ 13 int n; 14 while(cin>>n){ 15 int ll=(1<<30),rr=-1; 16 for(int i=1;i<=n;i++){ 17 cin>>s[i].l>>s[i].r; 18 s[i].len=s[i].r-s[i].l+1; 19 s[i].id=i; 20 ll=min(ll,s[i].l); 21 rr=max(rr,s[i].r); 22 } 23 sort(s+1,s+1+n,cmp); 24 if(s[1].len==(rr-ll+1)) 25 cout<<s[1].id<<endl; 26 else 27 cout<<-1<<endl; 28 } 29 return 0; 30 }
C.想了半天也不会。。知道是bfs,但是1e9的范围太尼玛大了。。然后看了下师傅代码。。神奇的map....Orz
C
1 #include<cstdio> 2 #include<iostream> 3 #include<queue> 4 #include<map> 5 using namespace std; 6 typedef long long ll; 7 const ll N=(ll)1e9; 8 ll sx,sy,ex,ey; 9 ll fun(ll x,ll y){ 10 return N*(x-1)+y; 11 } 12 map<ll,int>M; 13 int move[8][2]={{0,-1},{0,1},{-1,0},{1,0},{1,1},{1,-1},{-1,-1},{-1,1}}; 14 ll solve(){ 15 queue<ll>Q[3]; 16 Q[0].push(sx); 17 Q[1].push(sy); 18 Q[2].push(0); 19 M[fun(sx,sy)]=-1; 20 while(!Q[1].empty()){ 21 ll x=Q[0].front();Q[0].pop(); 22 ll y=Q[1].front();Q[1].pop(); 23 ll step=Q[2].front();Q[2].pop(); 24 if(x==ex&&y==ey)return step; 25 for(int i=0;i<8;i++){ 26 ll xx=x+move[i][0]; 27 ll yy=y+move[i][1]; 28 if(xx<1||xx>N||yy<1||yy>N)continue; 29 if(M[fun(xx,yy)]!=1)continue; 30 Q[0].push(xx); 31 Q[1].push(yy); 32 Q[2].push(step+1); 33 M[fun(xx,yy)]=-1; 34 } 35 } 36 return -1; 37 } 38 int main(){ 39 int m; 40 while(cin>>sx>>sy>>ex>>ey){ 41 M[fun(sx,sy)]=1; 42 M[fun(ex,ey)]=1; 43 cin>>m; 44 M.clear(); 45 int cnt=0; 46 for(int i=1;i<=m;i++){ 47 ll r,a,b; 48 cin>>r>>a>>b; 49 for(ll j=a;j<=b;j++){ 50 if(M[fun(r,j)]!=1) 51 M[fun(r,j)]=1; 52 } 53 54 } 55 cout<<solve()<<endl; 56 } 57 return 0; 58 }
D.解法:贪心。。。如果当前节点的值是最后不想要的,那么就press一下,因为被press之后就再也不可能回到原来的值了。。。
尼玛。。比赛的时候看都没看。。。
D
1 #include<cstdio> 2 #include<iostream> 3 #include<vector> 4 #include<cstring> 5 #include<algorithm> 6 #define N 100010 7 using namespace std; 8 vector<int>V[N]; 9 int s[N]; 10 int x[N],ans[N]; 11 bool used[N]; 12 int c; 13 void dfs(int rt){ 14 for(int i=0;i<V[rt].size();i++) 15 s[V[rt][i]]++; 16 for(int i=0;i<V[rt].size();i++){ 17 if(s[V[rt][i]]==x[V[rt][i]]){ 18 s[V[rt][i]]++; 19 ans[++c]=V[rt][i]; 20 dfs(V[rt][i]); 21 } 22 } 23 } 24 25 int main(){ 26 int n,m; 27 while(cin>>n>>m){ 28 memset(s,0,sizeof(s)); 29 c=0; 30 memset(used,0,sizeof(used)); 31 for(int i=1;i<=n;i++)V[i].clear(); 32 for(int i=1;i<=m;i++){ 33 int a,b; 34 cin>>a>>b; 35 V[a].push_back(b); 36 V[b].push_back(a); 37 } 38 for(int i=1;i<=n;i++)cin>>x[i]; 39 int w; 40 for(int i=1;i<=n;i++){ 41 if(s[i]==x[i]){ 42 s[i]++; 43 dfs(i); 44 ans[++c]=i; 45 } 46 } 47 cout<<c<<endl; 48 for(int i=1;i<=c;i++) 49 cout<<ans[i]<<" "; 50 cout<<endl; 51 } 52 return 0; 53 }
E.线段树维护即可。。。拆位。。。
统计每个区间每个二进制位上出现的1的个数。。最后求和的时候加一遍就行。。。异或相当于把这个数位上所以的1变成0.。。0变成1
E
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #define N 100010 6 #define lson l,m,n<<1 7 #define rson m+1,r,n<<1|1 8 using namespace std; 9 typedef long long ll; 10 ll s[N<<2][30]; 11 ll flag[N<<2]; 12 ll ans; 13 void pushup(int n){ 14 for(int i=0;i<30;i++){ 15 s[n][i]=s[n<<1][i]+s[n<<1|1][i]; 16 } 17 } 18 void pushdown(int n,int m){ 19 if(flag[n]){ 20 flag[n<<1]^=flag[n]; 21 flag[n<<1|1]^=flag[n]; 22 int f=flag[n]; 23 for(int i=0;i<30;i++){ 24 if(f&1){ 25 s[n<<1][i]=m-(m>>1)-s[n<<1][i]; 26 s[n<<1|1][i]=(m>>1)-s[n<<1|1][i]; 27 } 28 f>>=1; 29 } 30 flag[n]=0; 31 } 32 } 33 void build(int l,int r,int n){ 34 memset(s[n],0,sizeof(s[n])); 35 flag[n]=0; 36 if(l==r){ 37 int a; 38 cin>>a; 39 for(int i=0;i<30;i++){ 40 if(a&1)s[n][i]=1; 41 a>>=1; 42 } 43 return ; 44 } 45 int m=(l+r)>>1; 46 build(lson); 47 build(rson); 48 pushup(n); 49 50 } 51 void update(int ll,int rr,int x,int l,int r,int n){ 52 if(ll==l&&rr==r){ 53 flag[n]^=x; 54 for(int i=0;i<30;i++){ 55 if(x&1)s[n][i]=(r-l+1)-s[n][i]; 56 x>>=1; 57 } 58 return ; 59 } 60 pushdown(n,r-l+1); 61 int m=(l+r)>>1; 62 if(rr<=m) 63 update(ll,rr,x,lson); 64 else if(ll>m) 65 update(ll,rr,x,rson); 66 else 67 update(ll,m,x,lson),update(m+1,rr,x,rson); 68 pushup(n); 69 } 70 void query(int L,int R,int l,int r,int n){ 71 if(L==l&&R==r){ 72 for(int i=0;i<30;i++) 73 ans+=s[n][i]*(1LL<<i); 74 return ; 75 } 76 pushdown(n,r-l+1); 77 int m=(l+r)>>1; 78 if(R<=m)query(L,R,lson); 79 else if(L>m)query(L,R,rson); 80 else query(L,m,lson),query(m+1,R,rson); 81 } 82 int main(){ 83 int n,m; 84 int op,l,r,x; 85 while(cin>>n){ 86 build(1,n,1); 87 cin>>m; 88 while(m--){ 89 cin>>op; 90 if(op==1){ 91 cin>>l>>r; 92 ans=0; 93 query(l,r,1,n,1); 94 cout<<ans<<endl; 95 }else{ 96 cin>>l>>r>>x; 97 update(l,r,x,1,n,1); 98 } 99 } 100 } 101 return 0; 102 }