【Luogu】P4462异或序列(莫队)
生活随笔
收集整理的這篇文章主要介紹了
【Luogu】P4462异或序列(莫队)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
觀察什么時候x到y之間那一段可以被統計
xorsum[x-1]^xorsum[y]=k
xorsum[x-1]=xorsum[y]^k||xorsum[y]=xorsum[x-1]^k
莫隊維護。
#include<cstdio> #include<cstring> #include<algorithm> #include<cctype> #include<cstdlib> #include<cmath> #define maxn 200200 using namespace std; inline long long read(){long long num=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}while(isdigit(ch)){num=num*10+ch-'0';ch=getchar();}return num*f; }int blo[maxn]; int xum[maxn]; int sum[maxn]; long long ans[maxn];struct Que{int x,y,id;bool operator <(const Que a)const{if(blo[x]!=blo[a.x]) return blo[x]<blo[a.x];return y<a.y;} }q[maxn];int main(){int n=read(),m=read(),e=read();int sqt=sqrt(n);for(int i=1;i<=n;++i) blo[i]=(i-1)/sqt+1;for(int i=1;i<=n;++i) xum[i]=xum[i-1]^read();for(int i=1;i<=m;++i) q[i]=(Que){read(),read(),i};sort(q+1,q+m+1);int lef=1,rig=0;long long now=0;for(int i=1;i<=m;++i){while(lef<q[i].x-1){sum[xum[lef]]--;now-=sum[xum[lef]^e];lef++;}while(lef>q[i].x-1){lef--;now+=sum[xum[lef]^e];sum[xum[lef]]++;}while(rig<q[i].y){rig++;now+=sum[xum[rig]^e];sum[xum[rig]]++;}while(rig>q[i].y){sum[xum[rig]]--;now-=sum[xum[rig]^e];rig--;}ans[q[i].id]=now;}for(int i=1;i<=m;++i) printf("%lld\n",ans[i]);return 0; }?
轉載于:https://www.cnblogs.com/cellular-automaton/p/8886315.html
總結
以上是生活随笔為你收集整理的【Luogu】P4462异或序列(莫队)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: myeclipse打开jsp页面慢或者卡
- 下一篇: R语言实战学习笔记-高级数据管理