Codeforces Round #149 (Div. 2)【AK】

吐槽:比赛刚开始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 }

 

posted @ 2012-11-12 13:54  silver__bullet  阅读(1111)  评论(2)    收藏  举报