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

来源:互联网 发布:mac 删除文件 命令 编辑:程序博客网 时间:2024/05/16 06:32

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;}
原创粉丝点击