HDU 6186 CS Course(前缀+后缀)
Posted zyb993963526
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 6186 CS Course(前缀+后缀)相关的知识,希望对你有一定的参考价值。
http://acm.hdu.edu.cn/showproblem.php?pid=6186
题意:
给出n个数,共有n次询问,每次询问给出一个数p,求除去第p个数后的n-1个数的&、|、^值。
思路:
分别计算出&、|、^的前缀和后缀,将前缀和后缀相计算即可。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 const int maxn = 1e5+5; 6 7 int n, q; 8 int a[maxn], prea[maxn], suffa[maxn], preo[maxn], suffo[maxn], prex[maxn], suffx[maxn]; 9 10 int main() 11 { 12 //freopen("in.txt","r",stdin); 13 while(~scanf("%d%d",&n,&q)) 14 { 15 scanf("%d",&a[1]); 16 prea[1] = preo[1] = prex[1] = a[1]; 17 for(int i=2;i<=n;i++) 18 { 19 scanf("%d",&a[i]); 20 prea[i] = a[i] & prea[i-1]; 21 preo[i] = a[i] | preo[i-1]; 22 prex[i] = a[i] ^ prex[i-1]; 23 } 24 suffa[n] = suffo[n] = suffx[n] = a[n]; 25 for(int i=n-1;i>=1;i--) 26 { 27 suffa[i] = a[i] & suffa[i+1]; 28 suffo[i] = a[i] | suffo[i+1]; 29 suffx[i] = a[i] ^ suffx[i+1]; 30 } 31 while(q--) 32 { 33 int pos; scanf("%d",&pos); 34 int ans1 = prea[pos-1] & suffa[pos+1]; 35 int ans2 = preo[pos-1] | suffo[pos+1]; 36 int ans3 = prex[pos-1] ^ suffx[pos+1]; 37 if(pos==1) 38 { 39 ans1 = suffa[pos+1]; 40 ans2 = suffo[pos+1]; 41 ans3 = suffx[pos+1]; 42 } 43 if(pos==n) 44 { 45 ans1 = prea[pos-1]; 46 ans2 = preo[pos-1]; 47 ans3 = prex[pos-1]; 48 } 49 printf("%d %d %d ", ans1, ans2, ans3); 50 } 51 } 52 return 0; 53 }
以上是关于HDU 6186 CS Course(前缀+后缀)的主要内容,如果未能解决你的问题,请参考以下文章
HDU6186 2017广西邀请赛 CS Course (前缀和后缀)