CodeForces
来源:互联网 发布:react js 阮一峰 编辑:程序博客网 时间:2024/06/02 03:46
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#define INF 0x3f3f3f3f#define rep0(i, n) for (int i = 0; i < n; i++)#define rep1(i, n) for (int i = 1; i <= n; i++)#define rep_0(i, n) for (int i = n - 1; i >= 0; i--)#define rep_1(i, n) for (int i = n; i > 0; i--)#define MAX(x, y) (((x) > (y)) ? (x) : (y))#define MIN(x, y) (((x) < (y)) ? (x) : (y))#define mem(x, y) memset(x, y, sizeof(x))#define MAXN 100000 + 10#define MAXK 10000000 + 10/**题目大意给一个数列 和数字k 多次询问[l, r]范围内 有多少各连续子序列异或值为k思路没有区间修改 用莫队需要用O(1)复杂度转移预处理 pre[x] 表示 0 ~ x 的数的异或值则 i ~ j 的异或值为 pre[i - 1] ^ pre[j] 当在右边增加时询问 区间内(包括开区间下届) pre[j] ^ k 的个数当在左边增加时询问 区间内 pre[i - 1] ^ k 的个数简单的用两个hash维护下届开区间和闭区间内的各pre个数*/using namespace std;int sqn;struct query{ int l, r; int id; __int64 ans;} q[MAXN];__int64 a[MAXN], pre[MAXN], book[MAXK], book1[MAXK], ans, k;bool cmp(query a, query b){ if (a.l / sqn == b.l / sqn) return a.r < b.r; return a.l < b.l;}bool CMP(query a, query b){ return a.id < b.id;}void add(int x, bool flag){ book[pre[x]]++; if (x > 0) book1[pre[x - 1]]++; else book1[0]++; if (flag) { if (x > 0) ans += book[pre[x - 1] ^ k]; else ans += book[0 ^ k]; } else { ans += book1[pre[x] ^ k]; }}void del(int x, bool flag){ if (flag) { if (x > 0) ans -= book[pre[x - 1] ^ k]; else ans -= book[0 ^ k]; } else ans -= book1[pre[x] ^ k]; book[pre[x]]--; if (x > 0) book1[pre[x - 1]]--; else book1[0]--;}int main(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif // ONLINE_JUDGE int n, m; __int64 tmp; mem(book, 0); mem(book1, 0); scanf("%d %d %d", &n, &m, &k); //cout << n << " " << m <<endl; sqn = sqrt(n); for (int i = 0; i < n; i++) { scanf("%I64d", a + i); if (i == 0) { pre[i] = a[i]; tmp = a[i]; } else { pre[i] = tmp ^ a[i]; tmp = pre[i]; } } int l, r; for (int i = 0; i < m; i++) { scanf("%d %d", &l, &r); q[i].l = l - 1; q[i].r = r; q[i].id = i; } sort(q, q + m, cmp); ans = 0; l = r = 0; for (int i = 0; i < m; i++) { while (r < q[i].r) { add(r, 0); r++; } while (l > q[i].l) { l--; add(l, 1); } while (r > q[i].r) { r--; del(r, 0); } while (l < q[i].l) { del(l, 1); l++; } q[i].ans = ans; } sort(q, q + m, CMP); for (int i = 0; i < m; i++) printf("%I64d\n", q[i].ans); return 0;}
阅读全文
0 0
- codeforces~~~
- Codeforces
- codeforces
- Codeforces
- codeforces
- codeforces
- Codeforces
- Codeforces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- Construct新手体会2
- 使用Spring MVC的@ControllerAdvice注解做Json的异常处理
- WIN--Anaconda, python, tensorflow, opencv版本对应关系
- 如何加快变成速度,eclipse中快捷键的用法
- 机器学习(聚类分析)
- CodeForces
- 怎样往阿里云服务器传文件
- java8特性
- 解决tomcat同时部署两个SpringBoot应用提示InstanceAlreadyExistsException
- Multi view Geometry in Compution Vision 学习笔记 第一章
- BB = BB[sorted_ind, :] IndexError: too many indices for array
- BZOJ4029 4029: [HEOI2015]定价 贪心
- python中,从mysql读取数据,并存入redis里面(2)
- go语言学习-for循环