• BZOJ5301:[CQOI2018]异或序列——题解


    https://www.lydsy.com/JudgeOnline/problem.php?id=5301

    https://www.luogu.org/problemnew/show/P4462

    已知一个长度为 n 的整数数列 a[1],a[2],…,a[n] ,给定查询参数 l、r ,问在 [l,r] 区间内,有多少连续子序列满足异或和等于 k 。
    也就是说,对于所有的 x,y (l≤x≤y≤r),能够满足a[x]^a[x+1]^…^a[y]=k的x,y有多少组。

    开始时还在想怕不是一棵主席树(滑稽)。

    想多了,莫队足以解决。

    为了方便求区间异或和,把a处理为前缀异或和。

    剩下的看代码吧,不太好说,就是注意左端点的移动是要把它之前的点增/删,因为l~r的异或=a[r]^a[l-1]。

    #include<cstdio>
    #include<queue>
    #include<cctype>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int N=1e5+5;
    inline int read(){
        int X=0,w=0;char ch=0;
        while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
        while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
        return w?-X:X;
    }
    struct qu{
        int pos,l,r;
    }q[N];
    int a[N],ans[N],cnt[N],sum,n,m,k,s;
    inline int bel(int x){return (x-1)/s+1;}
    bool cmp(qu b,qu c){
        return bel(b.l)==bel(c.l)?b.r<c.r:b.l<c.l;
    }
    inline void add(int x){
        sum+=cnt[x^k];
        cnt[x]++;
    }
    inline void del(int x){
        cnt[x]--;
        sum-=cnt[x^k];
    }
    int main(){
        n=read(),m=read(),k=read();
        s=sqrt(n);
        for(int i=1;i<=n;i++)a[i]=a[i-1]^read();
        for(int i=1;i<=m;i++){
        q[i].pos=i;q[i].l=read();q[i].r=read();
        }
        sort(q+1,q+m+1,cmp);
        int ql=1,qr=0;cnt[0]++;
        for(int i=1;i<=m;i++){
        while(qr<q[i].r)add(a[++qr]);
        while(qr>q[i].r)del(a[qr--]);
        while(ql<q[i].l)del(a[ql-1]),ql++;
        while(ql>q[i].l)ql--,add(a[ql-1]);
        ans[q[i].pos]=sum;
        }
        for(int i=1;i<=m;i++)printf("%d
    ",ans[i]);
        return 0;
    }

    +++++++++++++++++++++++++++++++++++++++++++

    +本文作者:luyouqi233。               +

    +欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +

    +++++++++++++++++++++++++++++++++++++++++++

  • 相关阅读:
    Shell脚本学习笔记2
    Shell脚本学习笔记1
    华大MCU硬件SMBus的应用
    华大MCU的应用中的问题记录
    STM32定时器输入捕获功能应用——超声波模块
    STM32定时器应用——PWM
    利用KEIL的软件仿真的逻辑分析仪功能观察GPIO的波形
    周期性过程数据通信和非周期性邮箱数据通信
    JDBCUtils
    反射
  • 原文地址:https://www.cnblogs.com/luyouqi233/p/9008330.html
Copyright © 2020-2023  润新知