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

 

 

你可能感兴趣的:(codeforces)