hdu6186-思维&前缀和&后缀和-CS Course

http://acm.hdu.edu.cn/showproblem.php?pid=6186
给定你一组数,
在给你q个查询,
每个查询问你 除了当前的数,其他数组中所有数的 与 或 异或 值
异或是有反操作的。
对于 &和| , 我是通过维护一个前缀和后缀。
比方说,在计算a_i 的时候,输出 1-a_i-1 和a_(i+1)-a_n的与 和或
前缀和可以输入的时候维护,后缀和再扫一遍。

#include <bits/stdc++.h>

using namespace std;
int a[100050],ans1[100050],ans2[100050],ans3[100050];
struct Node
{  int x,y;
}node[100050],node2[100050];
int main()
{
    int n,p,x;

    while(scanf("%d%d",&n,&p)!=-1)
    {

        scanf("%d",&a[1]);
        node[0].x=0xffffffff;
        node[n+1].y=0xffffffff;
       // cout<<node[0].x<<endl;
        node2[0].x=0;
        node2[n+1].y=0;
        node[1].x=a[1];int c=a[1],d=a[1];
        //node[1].y=a[1];
        node2[1].x=a[1];
        for(int i=2;i<=n;i++)
        {
            scanf("%d",&a[i]);
            node[i].x=a[i]&node[i-1].x;
            node2[i].x=a[i]|node2[i-1].x;
            c=c|a[i];
            d=d^a[i];
        }
       node[n].y=a[n];
       node2[n].y=a[n];
        for(int i=n-1;i>=1;i--){
            node[i].y=node[i+1].y&a[i];
            node2[i].y=node2[i+1].y|a[i];}
         //for(int i=0;i<=n;i++){
            // cout<<node[i].x<<" "<<node[i].y<<endl;

        // }

        for(int i=0;i<p;i++)
        {
            scanf("%d",&x);
            ans1[i]=node[x-1].x&node[x+1].y;
            //cout<<node[x-1].x<<" "<<node[x+1].y<<endl;
            ans2[i]=node2[x-1].x|node2[x+1].y;
            ans3[i]=d^a[x];
        }
        for(int i=0;i<p;i++)
            printf("%d %d %d\n",ans1[i],ans2[i],ans3[i]);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值