这次题有点水 涨了不少
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 ",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 }
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 ",pp[1]); 65 } 66 return 0; 67 }