CodeForces - 617E(莫队)

xiaoxiao2021-02-28  62

开数组的时候少开了一个一个位置,wa很难过。

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<vector> #include<queue> #define ls 2*rt #define rs 2*rt+1 #define lson ls,L,mid #define rson rs,mid+1,R #define ll long long using namespace std; typedef pair<int,int> pii; const ll inf = 0x3f3f3f3f; /*void dis(int a[], int n){ printf("总数为%d个\n",n); for(int i = 0; i < n; i++) cout<<a[i]<<", "; cout<<endl<<"------------------"<<endl; }*/ const int mx = 1e5+1; int f[2000000]; int a[mx],po[mx]; int n,m,k; ll ans[mx],sum; struct no{ int l,r,id; }q[mx]; bool cmp(no &a, no &b){ if(po[a.l] != po[b.l]) return po[a.l] < po[b.l]; else return a.r < b.r; } void add(int x){ sum += f[a[x]^k]; f[a[x]]++; } void dele(int x){ f[a[x]]--; sum -= f[a[x]^k]; } int main(){ //int T=10; int l,r; scanf("%d%d%d",&n,&m,&k); a[0] = 0; int sq = sqrt(n); memset(f,0,sizeof(f)); f[0] = 1; sum = 0; for(int i = 1; i <= n; i++){ scanf("%d",a+i); a[i] = a[i]^a[i-1]; po[i] = i/sq; } for(int i = 1; i <= m; i++){ scanf("%d%d",&q[i].l,&q[i].r); q[i].id = i; } sort(q+1,q+m+1,cmp); l = 1; r = 0; for(int i = 1;i <= m; i++){ while(q[i].l < l) l--,add(l-1); while(q[i].l > l) dele(l-1),l++; while(q[i].r < r) dele(r),r--; while(q[i].r > r) r++,add(r); ans[q[i].id] = sum; } for(int i = 1; i <= m; i++) printf("%I64d\n",ans[i]); return 0; }
转载请注明原文地址: https://www.6miu.com/read-2623255.html

最新回复(0)