zoukankan      html  css  js  c++  java
  • Luogu P4462 [CQOI2018]异或序列

    一道稍微要点脑子的莫队题,原来省选也会搬CF原题

    首先利用(xor)的性质,我们可以搞一个异或前缀和的东西

    每一次插入一个数,考虑它和之前已经加入的数能产生多少贡献

    记一下之前的异或总值,然后还是利用异或的性质再异或一遍

    这个我们再开一个数组统计一下前缀亦或值的出现次数

    但是唯一要注意的就是一些细节问题,尤其是左端点加入(or删除)的时候要减一(搞前缀和的时候左端点肯定要减一的么)

    然后就可以水过了(我的代码莫队的时候写的有点骚)

    CODE

    #include<cstdio>
    #include<cctype>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int N=100005;
    struct data
    {
        int l,r,id; long long ans;
    }q[N];
    int a[N],n,m,k,size,tot,blk[N],L,R,sum[N],cnt[N<<1]={1};
    long long res;
    inline char tc(void)
    {
        static char fl[100000],*A=fl,*B=fl;
        return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
    }
    inline void read(int &x)
    {
        x=0; char ch; while (!isdigit(ch=tc()));
        while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
    }
    inline void write(int x)
    {
        if (x>9) write(x/10);
        putchar(x%10+'0');
    }
    inline bool cmp1(data a,data b)
    {
        return blk[a.l]<blk[b.l]||(blk[a.l]==blk[b.l]&&(blk[a.l]&1?a.r<b.r:a.r>b.r));
    }
    inline bool cmp2(data a,data b)
    {
        return a.id<b.id;
    }
    inline void add(int x)
    {
        res+=cnt[k^sum[x]]; ++cnt[sum[x]]; 
    }
    inline void del(int x)
    {
        --cnt[sum[x]]; res-=cnt[k^sum[x]]; 
    }
    int main()
    {
        //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
        register int i; read(n); read(m); read(k); size=sqrt(n);
        for (i=1;i<=n;++i) read(a[i]),blk[i]=(i-1)/size+1,sum[i]=sum[i-1]^a[i];
        for (i=1;i<=m;++i) read(q[i].l),read(q[i].r),q[i].id=i;
        sort(q+1,q+m+1,cmp1); L=1; R=0;
        for (i=1;i<=m;++i)
        {
            while (L>q[i].l) add(--L-1); while (L<q[i].l) del(-1+L++);
            while (R<q[i].r) add(++R); while (R>q[i].r) del(R--);
            q[i].ans=res;
        }
        for (sort(q+1,q+m+1,cmp2),i=1;i<=m;++i) write(q[i].ans),putchar('
    ');
        return 0;
    }
    
  • 相关阅读:
    pinpoint改造支持查询
    pinpoint本地开发——agent
    pinpoint本地开发——collector
    pinpoint本地开发-web模块
    第一个Vert.x程序
    ls bash: cannot create temp file for here-document: No space left on device
    hadoop磁盘空间不均衡的解决办法
    dubbo监控活跃线程数
    mac安装软件运行提示「xxx.app已损坏,打不开.你应该将它移到废纸篓」的解决办法
    python拆分excel脚本
  • 原文地址:https://www.cnblogs.com/cjjsb/p/9557242.html
Copyright © 2011-2022 走看看