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
",z2[ans],y2[ans],x2[ans]);
53             }else if(ans==n){
54                 printf("%d %d %d
",z1[ans],y1[ans],x1[ans]);
55             }else{
56                 printf("%d %d %d
",z2[ans]&z1[ans],y2[ans]|y1[ans],x2[ans]^x1[ans]);
57             }
58         }
59     }
60     return 0;
61 }
原文地址:https://www.cnblogs.com/yinghualuowu/p/7458686.html