【树状数组】区间出现偶数次数的异或和(区间不同数的异或和)@ 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 排队计划 树状数组+线段树
题目大意:给定一个序列.每次选择一个位置,把这个位置之后全部小于等于这个数的数抽出来,排序,再插回去,求每次操作后的逆序对数 首先我们每一次操作 对于这个位置前面的数 因为排序的数与前面的数位置关系不 ...
随机推荐
- 分布式监控系统开发【day38】:主机存活检测程序解析(七)
一.目录结构 二.入口 1.文件MonitorServer.py import os import sys if __name__ == "__main__": os.enviro ...
- 金融量化分析【day110】:金融基础知识
一.股票 股票: 股票是股份公司发给出资人的一种凭证,股票的持有者就是股份公司的股东. 股票的面值与市值 面值表示票面金额 市值表示市场价值 上市/IPO: 企业通过证券交易所公开向社会增发股票以募集 ...
- 第八节:Task的各类Task<TResult>返回值以及通用线程的异常处理方案。
一. Task的各种返回值-Task<TResult> PS: 在前面章节,我们介绍了Task类开启线程.线程等待.线程延续的方式,但我们并没有关注这些方式的返回值,其实他们都是有返回值的 ...
- 14、使用csv和excel存储豆瓣top250电影信息
记得我们第三关的时候爬取了豆瓣TOP250的电影名/评分/推荐语/链接,现在呢,我们要把它们存储下来,记得用今天课上学的csv和excel,分别存储下来哦- URL htt ...
- 使用kqueue的str_cli函数
void str_cli(FILE *fp, int sockfd) { , isfile; char buf[MAXLINE]; ]; struct timespec ts; struct stat ...
- input全选和取消全选
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- adb devices 报错处理
手机连接pc,cmd窗口输入命令adb devices报如下错误: adb server version (31) doesn't match this client (40)然后adb停止运行 这是 ...
- IEnumerable<T>和IQueryable<T>区别
LINQ查询方法一共提供了两种扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了IEnumerable<T>接口的集合进行扩展:Queryab ...
- 将DataTable转换为List<T>对象遇到问题:类型“System.Int64”的对象无法转换为类型“System.Int32”。
可以利用反射将DataTable转换为List<T>对象:原始链接http://www.jb51.net/article/67386.htm 但是该方法在DataTable里某个字段类型是 ...
- vue的配置环境篇
1.电脑已经安装的nodejs和webpack. 2.1)打开cmd.win+r.可以直接输入node -v查看版本.安装淘宝镜像 npm install -g cnpm --registry=ht ...