1 条题解
-
0
莫队
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; int n, m, k, blo, a[maxn], Xor[maxn], t[maxn*20]; long long ans[maxn], tmp; struct Query { int id, l, r; bool operator < (const Query &b) const { if (l / blo != b.l / blo) return l < b.l; return (l / blo % 2) ? (r < b.r) : (r > b.r); } } query[maxn]; void add(int x) { tmp += t[x^k]; t[x]++; } void del(int x) { t[x]--; tmp -= t[x^k]; } int main() { scanf("%d%d%d", &n, &m, &k); blo = sqrt(n); for (int i = 1; i <= n; i++) { scanf("%d", a+i); Xor[i] = Xor[i-1] ^ a[i]; } for (int i = 1; i <= m; i++) { query[i].id = i; scanf("%d%d", &query[i].l, &query[i].r); query[i].l--; } sort(query+1, query+m+1); for (int i = 1, l = 0, r = -1; i <= m; i++) { while (query[i].l < l) add(Xor[--l]); while (query[i].l > l) del(Xor[l++]); while (query[i].r < r) del(Xor[r--]); while (query[i].r > r) add(Xor[++r]); ans[query[i].id] = tmp; } for (int i = 1; i <= m; i++) printf("%lld\n", ans[i]); return 0; }
- 1
信息
- ID
- 8
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 2
- 已通过
- 1
- 上传者