XOR and Favorite Number Codeforces - 617E || [CQOI2018]异或序列

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

http://codeforces.com/problemset/problem/617/E

这个是莫队裸题了吧。。。

然而,注意:

1.答案开longlong

2.要用桶来代替map/unordered_map,不然会T;桶的大小要大于两倍值域(这是较松的上限,实际上限就是值域内两个数异或能得到的最大值,大概就是值域转换成二进制后每一位变成1后再转回十进制得到的值吧)

CF

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 using namespace std;
 5 typedef long long LL;
 6 int sum[100100];
 7 int l=1,r=0,blo,n,m,k;LL ans;
 8 int s1[2000100],s2[2000100];
 9 struct Q
10 {
11     int l,r,num;LL ans;
12 }q[100100];
13 bool operator<(const Q &a,const Q &b)
14 {
15     return ((a.l-1)/blo==(b.l-1)/blo)?a.r<b.r:a.l<b.l;
16 }
17 bool cmp(const Q &a,const Q &b)
18 {
19     return a.num<b.num;
20 }
21 void addR()
22 {
23     ++r;
24     s1[sum[r-1]]++;s2[sum[r]]++;
25     ans+=s1[sum[r]^k];
26 }
27 void delR()
28 {
29     ans-=s1[sum[r]^k];
30     s1[sum[r-1]]--;
31     s2[sum[r]]--;
32     --r;
33 }
34 void addL()
35 {
36     --l;
37     s1[sum[l-1]]++;s2[sum[l]]++;
38     ans+=s2[sum[l-1]^k];
39 }
40 void delL()
41 {
42     ans-=s2[sum[l-1]^k];
43     s1[sum[l-1]]--;
44     s2[sum[l]]--;
45     ++l;
46 }
47 int main()
48 {
49     int i;
50     scanf("%d%d%d",&n,&m,&k);blo=sqrt(n+0.5);
51     for(i=1;i<=n;i++)    scanf("%d",&sum[i]),sum[i]^=sum[i-1];
52     for(i=1;i<=m;i++)    scanf("%d%d",&q[i].l,&q[i].r),q[i].num=i;
53     sort(q+1,q+m+1);
54     for(i=1;i<=m;i++)
55     {
56         //printf("%d %d\n",q[i].l,q[i].r);
57         while(r<q[i].r)    addR();
58         while(l>q[i].l)    addL();
59         while(r>q[i].r)    delR();
60         while(l<q[i].l)    delL();
61         q[i].ans=ans;
62     }
63     sort(q+1,q+m+1,cmp);
64     for(i=1;i<=m;i++)    printf("%lld\n",q[i].ans);
65     return 0;
66 }
posted @ 2018-05-08 18:47  hehe_54321  阅读(147)  评论(0编辑  收藏  举报
AmazingCounters.com