Codeforces 617 E. XOR and Favorite Number

题目链接:http://codeforces.com/problemset/problem/617/E



一看这种区间查询的题目,考虑一下莫队。

如何${O(1)}$的修改和查询呢?

令${f(i,j)}$表示区间${\left [ l,r \right ]}$内数字的异或和。

那么:${f(l,r)=f(1,r)~~xor~~f(1,l-1)=k}$

记一下前缀异或和即可维护。


 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<cstring>
 8 using namespace std;
 9 #define maxn 3001000
10 #define llg long long
11 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
12 llg n,m,a[maxn],ans,L,R,Ans[maxn],c[maxn],SIZE,k,qzxor[maxn];
13 struct node
14 {
15     llg l,r,num;
16 }ask[maxn];
17
18 inline int getint()
19 {
20        int w=0,q=0; char c=getchar();
21        while((c<‘0‘ || c>‘9‘) && c!=‘-‘) c=getchar(); if(c==‘-‘) q=1,c=getchar();
22        while (c>=‘0‘ && c<=‘9‘) w=w*10+c-‘0‘, c=getchar(); return q ? -w : w;
23 }
24
25 bool cmp(const node&a,const node&b)
26 {
27     if (a.l/SIZE==b.l/SIZE) return a.r<b.r;
28     return a.l/SIZE<b.l/SIZE;
29 }
30
31 void inc(llg x,llg val) {if (x==0 || x>n) return ;ans+=c[val^k],c[val]++;}
32 void dec(llg x,llg val) {if (x==0 || x>n) return ; c[val]--; ans-=c[val^k];}
33
34 int main()
35 {
36     yyj("xor");
37     cin>>n>>m>>k;
38     for (llg i=1;i<=n;i++) a[i]=getint(),qzxor[i]=qzxor[i-1]^a[i];
39     for (llg i=1;i<=m;i++) ask[i].l=getint(),ask[i].r=getint(),ask[i].num=i;
40     SIZE=sqrt(n);
41     sort(ask+1,ask+m+1,cmp);
42     c[0]=1;
43     for (llg i=1;i<=m;i++)
44     {
45         llg l=ask[i].l,r=ask[i].r;
46         if (L>l) for (llg i=L-1;i>=l;i--) inc(i,qzxor[i-1]);
47         if (r>R) for (llg i=R+1;i<=r;i++) inc(i,qzxor[i]);
48         if (L<l)  for (llg i=L;i<l;i++) dec(i,qzxor[i-1]);
49         if (r<R) for (llg i=R;i>r;i--) dec(i,qzxor[i]);
50         Ans[ask[i].num]=ans;
51         L=l,R=r;
52     }
53     for (llg i=1;i<=m;i++) printf("%lld ",Ans[i]);
54     return 0;
55 }
时间: 2024-12-14 18:53:39

Codeforces 617 E. XOR and Favorite Number的相关文章

codeforces 617 E. XOR and Favorite Number(莫队算法)

题目链接:http://codeforces.com/problemset/problem/617/E 题目: 给你a1 a2 a3 ··· an 个数,m次询问:在[L, R] 里面又多少中 [l, r] 使得 al xor al+1 xor ··· ar 为 k. 题解: 本题只有区间查询没有区间修改,而且数据量不大(10w),所以可以用离线的方法解决. 使用莫队算法来解决,就需要O(1)的修改[L, R+1] .[L, R-1].[L+1, R].[L-1, R]. 详细的莫队可以百度学一

Codeforces Round #340 (Div. 2) E. XOR and Favorite Number 【莫队算法 + 异或和前缀和的巧妙】

任意门:http://codeforces.com/problemset/problem/617/E E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard output Bob has a favorite number k and ai of length n. Now he asks yo

Codeforces Round #340 (Div. 2) E. XOR and Favorite Number 莫队算法

E. XOR and Favorite Number Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Each query is given by a pair li and ri and asks you to count the number of pairs of integers i and j, such that l ≤ i ≤ j ≤ r and the xor

XOR and Favorite Number(莫队算法+分块)

E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard output Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Each query is given by a pai

Codeforces Round #209 (Div. 2)——Prime Number

MySQL使用的是插件式存储引擎. 主要包括存储引擎有:MyISAM,Innodb,NDB Cluster,Maria,Falcon,Memory,Archive,Merge,Federated. 其中最为广泛的是MyISAM 和Innodb两种存储引擎,所以接下来对它们做简单介绍. MyISAM 存储引擎简介 MyISAM 存储引擎的表存储在数据库中,每一个表都被存放为三个以表名命名的物理文件. 1.(.frm文件)任何存储引擎都不可缺少的存放表结构定义信息的文件 2.(.MYD文件)存放表数

CF617E XOR and Favorite Number

\(\verb|CF617E XOR and Favorite Number|\) 已知一个序列 \(a_1,\ a_2,\ \cdots,\ a_n\) 和 \(k\) ,\(m\) 次询问给出 \(l,\ r\) ,求 \(\displaystyle\sum_{i=l}^r\sum_{j=i}^r[a_x\oplus a_{x+1}\oplus \cdots \oplus a_y=k]\) \(n,\ m\leq10^5,\ 0\leq a_i,\ k\leq10^6\) 莫队 重题 \(\

CodeForces - 617E XOR and Favorite Number (莫队+前缀和)

Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Each query is given by a pair li and ri and asks you to count the number of pairs of integers i and j, such that l ≤ i ≤ j ≤ r and the xor of the numbers ai, ai + 1,

XOR and Favorite Number CodeForces - 617E -莫队-异或前缀和

CodeForces - 617E 给n个数, m个询问, 每次询问问你[l, r]区间内有多少对(i, j), 使得a[i]^a[i+1]^......^a[j]结果为k.(注意 i ! =  j)维护一个前缀异或值就可以了.要注意的是 区间[l, r], 我们需要将pre[l-1]......pre[r]都加进去, pre[l-1]不能少. #include<bits/stdc++.h> using namespace std; #define maxn 1234567 #define l

(莫队算法)CodeForces - 617E XOR and Favorite Number

题意: 长度为n的数列,m次询问,还有一个k.每次询问询问询问从数列的L到R内有多少个连续子序列异或起来等于k. 分析: 因为事先知道这题可以用莫队写,就正好用这题练习莫队. 预处理每个前缀异或和. 然后莫队按分块排序后,不断更新,用一个数组cnt[]记录当前L到R前缀和的数量. R向右拉,新增的数量就是cnt[pre^k],pre表示当前这个R位置的前缀异或和,然后更新一下cnt. 其他的也类似. 算是一个比较好的入门题. 代码: 1 #include <cstdio> 2 #include