标签:bsp ORC main end nbsp 次数 div 分块 mes
#include<bits/stdc++.h> using namespace std; const int N=1<<20; struct node{ int l,r; int id; }q[N]; int pos[N]; long long ans[N]; //每个前缀值出现的次数 long long flag[N]; int a[N]; bool cmp(node a,node b) { //如果左端点在同一块中,按右端点排序 if(pos[a.l]==pos[b.l]) return a.r<b.r; //否则,按照块来排序 return pos[a.l]<pos[b.l]; } int n,m,k; int l=1,r=0; long long Ans=0; void add(int x) { //当前 前缀和出现的次数-- Ans+=flag[a[x]^k]; flag[a[x]]++; } void del(int x) { //当前 前缀和出现的次数-- flag[a[x]]--; //总的减去 Ans-=flag[a[x]^k]; } int main() { cin>>n>>m>>k; int sz=sqrt(n); for(int i=1;i<=n;i++) { cin>>a[i]; //处理前缀和 a[i]=a[i]^a[i-1]; //分块 pos[i]=i/sz; } for(int i=1;i<=m;i++) { cin>>q[i].l>>q[i].r; q[i].id=i; } sort(q+1,q+1+m,cmp); flag[0]=1; for(int i=1;i<=m;i++) { while(l<q[i].l) { del(l-1); l++; } while(l>q[i].l) { l--; add(l-1); } while(r<q[i].r) { r++; add(r); } while(r>q[i].r) { del(r); r--; } ans[q[i].id]=Ans; } for(int i=1;i<=m;i++) cout<<ans[i]<<endl; return 0; }
Codeforces Round #340 (Div. 2) E XOR and Favorite Number 莫队板子
标签:bsp ORC main end nbsp 次数 div 分块 mes
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12348781.html