【树状数组】区间出现偶数次数的异或和(区间不同数的异或和)@ codeforce 703 D
【树状数组】区间出现偶数次数的异或和(区间不同数的异或和)@ codeforce 703 D
PROBLEM
题目描述
初始给定n个卡片拍成一排,其中第i个卡片上的数为x[i]。
有q个询问,每次询问给定L和R表示,询问的区间【L,R】内的卡片所有出现了偶数次的数的异或和是多少。
输入
输入一行两个整数n,q。
第二行n个整数,第i个数为x[i]。
接下来q行,每行两个整数L和R,表示询问的区间。
输出
输出q行,其中第i行表示第i次询问的区间出现偶数次的数的异或和。
样例输入
3 1
3 7 8
1 3
样例输出
0
SOlUTION
区间内出现偶数次的数异或和 = 区间内出现奇数次的数的异或和^区间内出现过的数的异或和
区间内出现奇数次的数的异或和 = 区间所有数的异或和
所以,区间内出现偶数次的数异或和 = 区间所有数的异或和^区间内出现过的数的异或和
于是问题转化成求区间内出现过的数的异或和:
可以类比求区间内不同数的个数:树状数组离线做法
这里树状数组sum(i)
的含义就是指以当前i
为结尾的前缀区间的不同数的异或和
先对询问按右端点排序
然后遍历每个询问,对于当前位置p,如果当前位置上的数x在之前出现过,把它在之前位置上的影响删除:
add(last[x],x);//由异或的性质可以知道,再异或一次就可以消除影响)
把它在当前位置的影响插入:
add(p,x);
更新记录最后位置的数组last[]
CODE
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1000005;
int n,q,x[MAXN];
int xorsum[MAXN],ans[MAXN];
map<int,int> last; // last position (right-most)
struct Query{
int l,r,ind;
}qry[MAXN];
bool qcmp(Query a,Query b){
return a.r<b.r;
}
int b[MAXN];
int lowbit(int x){
return x&-x;
}
void add(int pos,int val){
while (pos<=n) {
b[pos] ^= val;
pos+=lowbit(pos);
}
}
int sum(int pos){
int res = 0;
while (pos>=1){
res ^= b[pos];
pos-=lowbit(pos);
}
return res;
}
int main() {
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%d",x+i);
xorsum[i] = xorsum[i-1]^x[i];
}
for(int i=1;i<=q;i++){
scanf("%d%d",&qry[i].l,&qry[i].r);
qry[i].ind = i;
}
sort(qry+1,qry+q+1,qcmp); //sort query by right endpoint
for(int i=1,j=1;i<=q;i++){
while (j<=qry[i].r){
if(last[x[j]]) add(last[x[j]],x[j]); //delete pos
last[x[j]] = j;
add(j,x[j]); //add new pos
j++;
}
ans[qry[i].ind] = sum(qry[i].r)^sum(qry[i].l-1)^xorsum[qry[i].r]^xorsum[qry[i].l-1];
}
for(int i=1;i<=q;i++)
printf("%d\n",ans[i]);
return 0;
}
【树状数组】区间出现偶数次数的异或和(区间不同数的异或和)@ codeforce 703 D的更多相关文章
- Codeforces Round #590 (Div. 3)【D题:26棵树状数组维护字符出现次数】
A题 题意:给你 n 个数 , 你需要改变这些数使得这 n 个数的值相等 , 并且要求改变后所有数的和需大于等于原来的所有数字的和 , 然后输出满足题意且改变后最小的数值. AC代码: #includ ...
- Educational Codeforces Round 10 D. Nested Segments 【树状数组区间更新 + 离散化 + stl】
任意门:http://codeforces.com/contest/652/problem/D D. Nested Segments time limit per test 2 seconds mem ...
- 树状数组区间修改and查询和
在差分数组上稍加改变,就可以实现这个骚操作 首先我们先来看一看普通的树状数组(基于差分)怎么暴力的求解区间和就是询问区间长度次和 \(\sum^{i=1}_{len}\sum^{j=1}_{i}bas ...
- 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间
从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...
- 【bzoj3289】Mato的文件管理 离散化+莫队算法+树状数组
原文地址:http://www.cnblogs.com/GXZlegend/p/6805224.html 题目描述 Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份 ...
- 【序列操作IV】树状数组套线段树/树套树
题目描述 给出序列 a1,a2,…,an(0≤ai≤109),有关序列的两种操作. 1. ai(1≤i≤n)变成 x(0≤x≤109). 2. 求 al,al+1,…,ar(1≤l≤r≤n)第 k(1 ...
- 树状数组 && 板子
本文树状数组讲解转载于:https://www.cnblogs.com/xenny/p/9739600.html 本文新加内容为模板代码部分 1.什么是树状数组? 顾名思义,就是用数组来模拟树形结构呗 ...
- Mishka and Interesting sum Codeforces Round #365 (树状数组)
树状数组,与Turing Tree类似. xr[i]表示从1到i的抑或,树状数组维护从1到i每个数只考虑一次的异或,结果为sum(r) ^ sum(l) ^ xr[r] ^ xr[l] 其中xr[r] ...
- BZOJ 1878: [SDOI2009]HH的项链 离线树状数组
1878: [SDOI2009]HH的项链 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- BZOJ 3333 排队计划 树状数组+线段树
题目大意:给定一个序列.每次选择一个位置,把这个位置之后全部小于等于这个数的数抽出来,排序,再插回去,求每次操作后的逆序对数 首先我们每一次操作 对于这个位置前面的数 因为排序的数与前面的数位置关系不 ...
随机推荐
- Python的设计模式
设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码.反之,设计模式更为高级,它是一种必须在特定情 ...
- MongoDB3.6 一键化自动部署方案
1.系统基础配置 下面的命令默认都使用root用户进行操作,操作系统为Centos7,mongodb3.6.x以上版本 1.1 修改系统配置文件/etc/security/limits.conf和/e ...
- redis发布/订阅
发布订阅简介 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息,消息之间通过channel传递. 准备工作 两台安装了redis的机器(虚拟 ...
- 第29月第21天 ios android curl
1.curl https://github.com/gcesarmza/curl-android-ios/ 2.json https://github.com/danielmapar/cpp-scra ...
- scala可变var与不可变val的理解
我们定义变量的时候分为var可变变量和val不可变变量. 我们使用容器的时候也分为可变容器和不可变容器. List和Tuple本身就是不可变的,set和map分为可变和不可变的,默认为不可变. 我们看 ...
- redux知识点
1.关于传参 点击跳转 两种 动态路由 url 但是取值需要自己处理 关于动态跳转(js执行跳转) 关于异步加载组件 创建loadable app.js中 在 要加载的异步组件中 (这样接收参数不 ...
- Javascript arguments.callee和caller的区别
一.callee 在学习callee之前,需要先学习arguments. arguments: 含义:该对象代表正在执行的函数和调用它的函数的参数. 语法: 1 [function.]argument ...
- dubbo监控中心与admin管理项目的使用
监控中心与admin管理项目都是针对特定的注册中心进行监控,因此需要配置对应的注册中心的地址,或者在dubbo.properties或者在applications.properties文件配置. == ...
- 实现JWT刷新机制以及让过期时间更精确
借助accessToken和refreshToken实现 accessToken控制刷新间隔,refreshToken控制最长过期时间 Min过期时间 = refreshToken过期时间 ...
- file_get_contents函数偶尔报错的抑制显示
$result = @file_get_contents($url);可以使用@进行抑制file_get_contents()的报错 @是为了抑制错误显示,让用户看不到,提升用户体验.注意:只是抑制错 ...