2017ACM/ICPC广西邀请赛 CS Course
题意:删除指定数字,求剩下数字的与或非值
解法:保存一下前缀和后缀
1 #include <iostream> 2 #include <stdio.h> 3 #include <vector> 4 #include <string.h> 5 #include <map> 6 using namespace std; 7 int x1[123456],y1[123456],z1[123456]; 8 int x2[123456],y2[123456],z2[123456]; 9 int num[123456]; 10 map<int,int>Mp; 11 int n,m; 12 map<int,int>::iterator it; 13 int main(){ 14 while(~scanf("%d%d",&n,&m)){ 15 memset(x1,0,sizeof(x1)); 16 memset(y1,0,sizeof(y1)); 17 memset(z1,0,sizeof(z1)); 18 memset(x2,0,sizeof(x2)); 19 memset(y2,0,sizeof(y2)); 20 memset(z2,0,sizeof(z2)); 21 for(int i=1;i<=n;i++){ 22 scanf("%d",&num[i]); 23 } 24 x1[2]=num[1]; 25 x2[n-1]=num[n]; 26 y1[2]=num[1]; 27 y2[n-1]=num[n]; 28 z1[2]=num[1]; 29 z2[n-1]=num[n]; 30 for(int i=3;i<=n;i++){ 31 x1[i]=x1[i-1]^num[i-1]; 32 } 33 for(int i=n-2;i>=1;i--){ 34 x2[i]=x2[i+1]^num[i+1]; 35 } 36 for(int i=3;i<=n;i++){ 37 y1[i]=y1[i-1]|num[i-1]; 38 } 39 for(int i=n-2;i>=1;i--){ 40 y2[i]=y2[i+1]|num[i+1]; 41 } 42 for(int i=3;i<=n;i++){ 43 z1[i]=z1[i-1]&num[i-1]; 44 } 45 for(int i=n-2;i>=1;i--){ 46 z2[i]=z2[i+1]&num[i+1]; 47 } 48 while(m--){ 49 int ans; 50 scanf("%d",&ans); 51 if(ans==1){ 52 printf("%d %d %d\n",z2[ans],y2[ans],x2[ans]); 53 }else if(ans==n){ 54 printf("%d %d %d\n",z1[ans],y1[ans],x1[ans]); 55 }else{ 56 printf("%d %d %d\n",z2[ans]&z1[ans],y2[ans]|y1[ans],x2[ans]^x1[ans]); 57 } 58 } 59 } 60 return 0; 61 }