Codeforces 617E XOR and Favorite Number 【莫队】
2016-01-24 16:24
387 查看
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 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, ..., aj is
equal to k.
Input
The first line of the input contains integers n, m and k (1 ≤ n, m ≤ 100 000, 0 ≤ k ≤ 1 000 000) —
the length of the array, the number of queries and Bob's favorite number respectively.
The second line contains n integers ai (0 ≤ ai ≤ 1 000 000) —
Bob's array.
Then m lines follow. The i-th
line contains integers li and ri (1 ≤ li ≤ ri ≤ n) —
the parameters of the i-th query.
Output
Print m lines, answer the queries in the order they appear in the input.
Sample test(s)
input
6 2 3 1 2 1 1 0 3 1 6 3 5
output
7 0
input
5 3 1 1 1 1 1 1 1 5 2 4 1 3
output
9 4 4
Note
In the first sample the suitable pairs of i and j for
the first query are: (1, 2),
(1, 4), (1, 5),
(2, 3), (3, 6),
(5, 6), (6, 6).
Not a single of these pairs is suitable for the second query.
In the second sample xor equals 1 for all subarrays of an odd length.
题意:有n个数和m次查询,每次查询区间[l, r]问满足ai ^ ai+1 ^ ... ^ aj == k的(i, j) (l <= i <= j <= r)有多少对。
思路:离线做。首先预处理前缀异或和sum[],那么ai ^ ... ^ aj == sum[i-1] ^ sum[j]。
这样对一次查询[l, r]的处理,可以从左到右扫一次,统计k ^ sum[i]出现的次数(l <= i <= r)。
假设已经处理到[L, R],对下一次的[l, r]处理——
若L < l,显然多余,需要去掉[L, l-1]的部分,若L > l需要加上[l, L-1]的部分,反之不需要处理。
若R > r,..................[r+1, R]......,若R < r........[R+1, r]......,..............。
用莫队做即可。
AC代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <set> #include <vector> #include <string> #define INF 0x3f3f3f3f #define eps 1e-8 #define MAXN (100000+10) #define MAXM (200000+10) #define Ri(a) scanf("%d", &a) #define Rl(a) scanf("%lld", &a) #define Rf(a) scanf("%lf", &a) #define Rs(a) scanf("%s", a) #define Pi(a) printf("%d\n", (a)) #define Pf(a) printf("%.2lf\n", (a)) #define Pl(a) printf("%lld\n", (a)) #define Ps(a) printf("%s\n", (a)) #define W(a) while((a)--) #define CLR(a, b) memset(a, (b), sizeof(a)) #define MOD 1000000007 #define LL long long #define lson o<<1, l, mid #define rson o<<1|1, mid+1, r #define ll o<<1 #define rr o<<1|1 #define PI acos(-1.0) using namespace std; struct Node{ int l, r, id; LL ans; }; Node num[MAXN]; bool cmp1(Node a, Node b) { if(a.l / 400 != b.l / 400) return a.l / 400 < b.l / 400; else return a.r < b.r; } bool cmp2(Node a, Node b){ return a.id < b.id; } LL cnt[20000000+10]; int sum[MAXN]; int main() { int n, m, k; Ri(n); Ri(m); Ri(k); int a; for(int i = 1; i <= n; i++) Ri(a), sum[i] = sum[i-1] ^ a; for(int i = 1; i <= m; i++) Ri(num[i].l), Ri(num[i].r), num[i].id = i, num[i].l--; sort(num+1, num+m+1, cmp1); LL s = 0; int L = num[1].l, R = num[1].r; for(int i = L; i <= R; i++) { s += cnt[k ^ sum[i]]; cnt[sum[i]]++; } num[1].ans = s; for(int i = 2; i <= m; i++) { while(L > num[i].l) { L--; s += cnt[k ^ sum[L]]; cnt[sum[L]]++; } while(L < num[i].l) { //L++; cnt[sum[L]]--; s -= cnt[k ^ sum[L]]; L++; } while(R < num[i].r) { R++; s += cnt[k ^ sum[R]]; cnt[sum[R]]++; } while(R > num[i].r) { //R--; cnt[sum[R]]--; s -= cnt[k ^ sum[R]]; R--; } num[i].ans = s; } sort(num+1, num+m+1, cmp2); for(int i = 1; i <= m; i++) Pl(num[i].ans); return 0; }
相关文章推荐
- Codeforces 617D Polyline 【枚举】
- Codeforces 617B Chocolate 【dp】
- 使用ODBC创建数据源出现未发现 ”Oracle(TM) 客户端和网络组件“问题解决方案
- CF 613C(Necklace-构造法)
- poj3159 Candies(差分约束,最短路)
- Codeforces 617A Elephant 【水题】
- 21.1 关于库的基本知识
- BestCoder Round #69 (div.2)-Baby Ming and phone number(模拟)
- ldd3随书源码移植
- Django项目让本地和服务器环境数据库配置自动切换
- Android 通过Base64上传图片到服务器
- SVN 一次性提交多个目录中文件的方法
- File file:/data1/hadoop/yarn/local/usercache/hp/appcache/application_* does not exi
- 80.Longest Common Prefix
- 云计算基础架构
- Intent传递数据从一个Activity到另一个Activity
- 【技术研究-泛型1】泛型基础——C++模板
- set方法内存分析(1)
- poj3253
- 监考风波