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;
}

 

posted @ 2018-05-26 18:25  Somnus、M  阅读(211)  评论(0编辑  收藏  举报