Codeforces Round #197 (Div. 2)

这次题有点水 涨了不少

A题 转成数字 排下序就好

B题 直接模拟

C题 dfs

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 using namespace std;
 7 #define N 1010
 8 char s[12];
 9 int a[12],o,m,k[1010],flag;
10 void dfs(int pre,int s1,int s2,int v)
11 {
12     int i;
13     if(flag)
14     return ;
15     if(v)
16     k[v] = pre;
17     if(v==m)
18     {
19         flag = 1;
20         puts("YES");
21         for(i = 1; i < m ; i++)
22         printf("%d ",k[i]);
23         printf("%d\n",k[m]);
24         return ;
25     }
26     for(i = 1; i <= o ; i++)
27     {
28         if(a[i]!=pre&&(a[i]+s1)>s2)
29         {
30 
31             dfs(a[i],s2,a[i]+s1,v+1);
32         }
33     }
34 }
35 int main()
36 {
37     int i;
38     cin>>s;
39     cin>>m;
40     for(i = 0 ; i < 10 ; i++)
41     {
42         if(s[i]=='1')
43         {
44             o++;
45             a[o] = i+1;
46         }
47     }
48     dfs(-1,0,0,0);
49     if(!flag)
50     puts("NO");
51     return 0;
52 }
View Code

D题 裸线段树

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 using namespace std;
 7 #define N 150010
 8 #define LL __int64
 9 LL s[N<<2],pp[N<<2],b,q[N];
10 int n,p;
11 int o;
12 void up(int w)
13 {
14     if(s[w]%2==o)
15     {
16         pp[w] = pp[w<<1]|pp[w<<1|1];
17     }
18     else
19     {
20         pp[w] = pp[w<<1]^pp[w<<1|1];
21     }
22 
23 }
24 void build(int l,int r,int w,int v)
25 {
26     s[w] = v;
27     if(l==r)
28     {
29         pp[w] = q[l];
30         return ;
31     }
32     int m = (l+r)>>1;
33     build(l,m,w<<1,v+1);
34     build(m+1,r,w<<1|1,v+1);
35     up(w);
36 }
37 void update(int p,LL d,int l,int r,int w)
38 {
39     if(l==r)
40     {
41         pp[w] = d;
42         return ;
43     }
44     int m = (l+r)>>1;
45     if(p<=m)
46     update(p,d,l,m,w<<1);
47     else
48     update(p,d,m+1,r,w<<1|1);
49     up(w);
50 }
51 int main()
52 {
53     int m,i;
54     scanf("%d%d",&n,&m);
55     o = n%2;
56     n = 1<<n;
57     for(i = 1; i <= n ; i++)
58     scanf("%I64d",&q[i]);
59     build(1,n,1,1);
60     for(i = 1; i <= m ; i++)
61     {
62         scanf("%d%I64d",&p,&b);
63         update(p,b,1,n,1);
64         printf("%I64d\n",pp[1]);
65     }
66     return 0;
67 }
View Code

 

 

posted @ 2013-08-27 14:42  _雨  阅读(246)  评论(0编辑  收藏  举报