题目链接  Mishka and Interesting sum

题意  给定一个数列和$q$个询问,每次询问区间$[l, r]$中出现次数为偶数的所有数的异或和。

设区间$[l, r]$的异或和为$s(l, r)$, 区间$[l, r]$中所有出现过的数的异或和为$c(l, r)$

那么每个询问的答案为$s(l, r)$ $xor$ $c(l, r)$。

对于$s(l, r)$的求解维护一个前缀和即可。

对于$c(l, r)$, 把所有的询问离线并按照左端点升序排序(右端点无所谓,但是我程序里还是考虑了)

然后把数列中所有第一个出现的数加到树状数组里。

每个询问处理下来,要保证当前询问的$l$之前的$l - 1$个数已经在树状数组中被删除。

所谓被删除就是当前位置$x$上的元素被移去。

同时考虑位置$y$,满足$a_{x}=a_{y}, y > x$且$y$最小。(在$a_{x}$第一个和$a_{x}$值相同的元素的位置)

在位置$y$上把$a_{y}$加入树状数组,这样就可以离线求$c(l, r)$了。

时间复杂度$O(nlogn)$。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) const int N = 1e6 + 10; struct node{
int l, r, id;
friend bool operator < (const node &a, const node &b){
return a.l == b.l ? a.r < b.r : a.l < b.l;
}
} q[N]; int a[N], c[N], nxt[N];
int n, m;
int ans[N], s[N];
int l;
unordered_map <int, int> mp; int update(int x, int val){
for (; x <= n; x += x & -x) c[x] ^= val;
} int query(int x){
int ret = 0;
for (; x; x -= x & -x) ret ^= c[x];
return ret;
} int undo(int x){
update(x, a[x]);
if (nxt[x]) update(nxt[x], a[nxt[x]]);
} int main(){ scanf("%d", &n);
rep(i, 1, n) scanf("%d", a + i);
rep(i, 1, n) s[i] = s[i - 1] ^ a[i]; rep(i, 1, n){
if (mp.count(a[i])) continue;
else{
mp[a[i]] = 1;
update(i, a[i]);
}
} mp.clear(); dec(i, n, 1){
nxt[i] = (mp.count(a[i])) ? mp[a[i]] : 0;
mp[a[i]] = i;
} scanf("%d", &m);
rep(i, 1, m){
scanf("%d%d", &q[i].l, &q[i].r);
q[i].id = i;
} sort(q + 1, q + m + 1); l = 1;
rep(i, 1, m){
while (l < q[i].l){
undo(l);
++l;
} ans[q[i].id] = query(q[i].r) ^ s[q[i].r] ^ s[q[i].l - 1];
} rep(i, 1, m) printf("%d\n", ans[i]);
return 0;
}

最新文章

  1. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)
  2. ubuntu Chromium 安装 pepperflashplugin
  3. 洛谷P1168 中位数
  4. C# 溢出检查
  5. 回归测试---junit
  6. win7 64位安装oracle10g出现未知错误,程序异常终止解决方法
  7. oracle中job定时调用存储过程的实例
  8. 【转】Ubuntu常用软件合集
  9. hdu_5719_Arrange(脑洞题)
  10. FLASHBACK介绍
  11. [UE4]引用Grabbable接口
  12. Zookeeper-watcher机制源码分析(二)
  13. Android 简历 怎么写? 月薪10K,20K+, 怎么拿到面试?
  14. Java 面试题 MD
  15. Python+OpenCV图像处理(十三)—— Canny边缘检测
  16. Java IO 类一览表
  17. Sql Server 中使用日期遍历
  18. Go语言设计模式实践:迭代器(Iterator)
  19. [Android Tips] 26. Multiple Maven repositories in Gradle
  20. Hadoop 入门教程

热门文章

  1. POJ:2492-Bug's Life(二分图的判定)
  2. [原]sencha touch之布局
  3. java.util.ArrayList与java.util.Arrays$ArrayList区别
  4. nsfwjs鉴黄识别最小化案例
  5. leetcode 【 Merge k Sorted Lists 】python 实现
  6. java io 流 输入输出 大牛经典总结
  7. vmware安装centos7 安装redis windows7访问redis
  8. Chrome DevTools &amp; performance optimization
  9. wewe
  10. 二叉树节点个数,叶子个数,第K层个数,最低公共节点