HDU6186 2017广西邀请赛 CS Course (前缀和后缀)
Posted Fy1999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU6186 2017广西邀请赛 CS Course (前缀和后缀)相关的知识,希望对你有一定的参考价值。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6186
思路:题目要求的删除第q个数候所有数的 & | ^和,所以提前求出前缀和后缀,每次& | ^ 前i-1个和后i+1个即可。注意a^b^b=a;
#include <iostream> #include <cstdio> using namespace std; const long long maxn=1e5+10; int n,q; long long f1[maxn],f2[maxn]; long long e1[maxn],e2[maxn]; long long a[maxn]; int main() { while(~scanf("%d%d",&n,&q)) { for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); } f1[1]=f2[1]=a[1]; long long ans=a[1]; for(int i=2;i<=n;i++) { f1[i]=f1[i-1]&a[i]; f2[i]=f2[i-1]|a[i]; ans^=a[i]; } e1[n]=e2[n]=a[n]; for(int i=n-1;i>=1;i--) { e1[i]=e1[i+1]&a[i]; e2[i]=e2[i+1]|a[i]; } while(q--) { int x; cin>>x; if(x==1) printf("%lld %lld %lld\n",e1[2],e2[2],a[x]^ans); else if(x==n) printf("%lld %lld %lld\n",f1[x-1],f2[x-1],a[x]^ans); else printf("%lld %lld %lld\n",f1[x-1]&e1[x+1],f2[x-1]|e2[x+1],a[x]^ans); } } return 0; }
以上是关于HDU6186 2017广西邀请赛 CS Course (前缀和后缀)的主要内容,如果未能解决你的问题,请参考以下文章