树状数组【CF703D】Mishka and Interesting sum
Description
给你n( 1<=n<=1000000)个数,以及m(1<=m<=1000000)个询问,每个询问包括l和r,问你在这n个数中,区间l~r,出现偶数个数的数的异或和
Input
第一行一个整数 n,表示数列的长度
接下来一行 n 个非负整数,表示 a 数组中的每个元素
接下来一行一个整数 m,表示查询的数量
接下来 m 行,每行两个整数 l, r 表示这次查询区间的左右端点
Output
对于每组查询,输出一行一个整数,表示这组查询的答案
刚看到题的一瞬间,输出出现偶数次的数的异或和.
"不是0嘛?这不sb题?"
突然发现看错题.
原来是求出现偶数次的单个数的异或和。
通过一些推导可以发现,答案是求区间内不同数的异或和与区间异或和的异或和。
为什么?
我们假设当前查询的区间的数为:\(1,3,4,2,5,4,1\)
此时根据异或的性质\(x\) ^\(x=0\),我们再异或上区间内不同的数。
则这段异或起来就是:\(1\)^\(4\)。
稍作解释一下
我们区间中出现偶数次的数的异或和就是\(0\),此时再异或上区间内不同的数。
此时这些出现偶数次的数的异或再次出现。
而那些出现单次的数就消失了.
那么现在问题就变为维护区间内不同的数的异或和
这题数据范围的话,需要离散化。
因为没有修改操作,所以考虑离线.我们对右端点进行排序(从小到大)
然后考虑用一种数据结构维护:线段树 or 树状数组。
这里用了树状数组。
树状数组维护异或。
记录一下这个数上一个出现的位置.
然后遇到某个位置再出现,我们再在树状数组删去这个数几个(即再异或一次.)
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#define R register
using namespace std;
const int gz=3000008;
inline void in(R int &x)
{
R int f=1;x=0;R char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
}
int n,a[gz],sum[gz],pre[gz],b[gz],head[gz];
int new_n=1,q,ans[gz];
struct cod
{
int l,r,idx;
bool operator <(const cod&a)const
{
return r<a.r;
}
}que[gz];
#define lowbit(x) x&-x
int tr[gz<<1];
inline void add(R int o,R int del)
{
for(;o<=n;o+=lowbit(o))
tr[o]^=del;
}
inline int query(R int o)
{
R int res=0;
for(;o;o-=lowbit(o))
res^=tr[o];
return res;
}
int main()
{
in(n);
for(R int i=1;i<=n;i++)in(a[i]),b[i]=a[i];
sort(b+1,b+n+1);
for(R int i=2;i<=n;i++)
if(b[new_n]!=b[i])b[++new_n]=b[i];
for(R int i=1;i<=n;i++)
a[i]=lower_bound(b+1,b+new_n+1,a[i])-b;
for(R int i=1;i<=n;i++)
{
sum[i]=sum[i-1]^b[a[i]];
pre[i]=head[a[i]];
head[a[i]]=i;
}
in(q);
for(R int i=1;i<=q;i++)
in(que[i].l),in(que[i].r),que[i].idx=i;
sort(que+1,que+q+1);
R int now=1;
for(R int i=1;i<=q;i++)
{
R int r=que[i].r,l=que[i].l;
while(now<=r)
{
if(pre[now])
add(pre[now],b[a[now]]);
add(now,b[a[now]]);
now++;
}
ans[que[i].idx]=(query(r)^query(l-1))^(sum[r]^sum[l-1]);
}
for(R int i=1;i<=q;i++)
printf("%d\n",ans[i]);
return 0;
}
树状数组【CF703D】Mishka and Interesting sum的更多相关文章
- [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算
[CF703D]Mishka and Interesting sum/[BZOJ5476]位运算 题目大意: 一个长度为\(n(n\le10^6)\)的序列\(A\).\(m(m\le10^6)\)次 ...
- 差分+树状数组【p4868】Preprefix sum
Description 前缀和(prefix sum)\(S_i=\sum_{k=1}^i a_i\). 前前缀和(preprefix sum) 则把\(S_i\)作为原序列再进行前缀和.记再次求得前 ...
- CF703D Mishka and Interesting sum
题意:给定一个1e6长度的值域1e9的数组.每次给定询问,询问区间内出现偶数次的数的异或和. 题解:首先很显然,每一次询问的答案,等于这个区间所有不同元素异或和异或上区间异或和.(因为出现偶数次的对区 ...
- 树状数组【bzoj3155】: Preprefix sum
3155: Preprefix sum 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3155 把给出的a_i当成查分数组d_i做就可以了 ...
- HDU 4267 A Simple Problem with Integers --树状数组
题意:给一个序列,操作1:给区间[a,b]中(i-a)%k==0的位置 i 的值都加上val 操作2:查询 i 位置的值 解法:树状数组记录更新值. 由 (i-a)%k == 0 得知 i%k == ...
- 【BZOJ】1012: [JSOI2008]最大数maxnumber(树状数组+rmq)
http://www.lydsy.com/JudgeOnline/problem.php?id=1012 树状数组原来我只懂得sum和add的操作,今天才知道可以有求区间最值的操作,我学习了一下写了个 ...
- poj1159二维树状数组
Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows ...
- poj3321 dfs序+树状数组单点更新 好题!
当初听郭炜老师讲时不是很懂,几个月内每次复习树状数组必看的题 树的dfs序映射在树状数组上进行单点修改,区间查询. /* 树状数组: lowbit[i] = i&-i C[i] = a[i-l ...
- 树状数组 简单题 cf 961E
题目链接 : https://codeforces.com/problemset/problem/961/E One day Polycarp decided to rewatch his absol ...
随机推荐
- 2017 Multi-University Training Contest - Team 4 phone call(树+lca+并查集)
题解: (并查集处理往上跳的时候,一定要先让u,v往上跳到并查集的祖先,不然会wa掉) 代码如下: #include <iostream> #include <algorithm&g ...
- strings用法小记
By francis_hao Feb 14,2017 打印文件中可打印字符,每个序列至少四(可配置)个字符长.主要用于显示非文本文件 概述 选项解释 -a --all - 扫描整个文件,不管 ...
- Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) B
B. Problems for Round time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- bzoj Gty的超级妹子树 块状树
Gty的超级妹子树 Time Limit: 7 Sec Memory Limit: 32 MBSubmit: 500 Solved: 122[Submit][Status][Discuss] De ...
- mycat 管理MySQL5.7主从搭建
1.首先安装MySQL ab: 192.168.6.163 master 192.168.6.167 slave master: vi /etc/opt/rh/rh-mysql57/my.cnf.d/ ...
- C++构造函数重载以及默认参数引起的二义性
大家都知道当我们声明一个类时,系统会提供一个默认构造函数.当我们需要提供参数进行对类数据成员进行初始化时,就需要对类的带参构造函数进行重载.同时,如果我们需要调用默认构造函数进行类数据成员的初始化时, ...
- HDU1025---(LIS 最长上升子序列 的应用)
分析: n行 每行包含两个整数p r;意思是p从到r 不能有交叉的路 p刚好从1->n, 可看做下标,到的地方看做值 就转化为了最长上升子序列的问题 此题难点,怎么将其转化为LIS问题 #inc ...
- 【洛谷 SP283】NAPTIME - Naptime(DP)
题目链接 先考虑如果只有一天,那么该怎么做. 设\(f[i][j][1]\)表示前\(i\)个小时睡了\(j\)个小时并且第\(j\)个小时正在睡觉时的最大体力,\(f[i][j][1]\)表示前\( ...
- hdu 2112 HDU Today (最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目大意:给出起点和终点,然后算出最短的路. 不过有好多细节要注意: (1)起始点和终止点相等的 ...
- 类的 propert,classmethod,ataticmethod 方法 与 多态
一 .property 将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数 然后计算出来的,这种特性的使用方式遵循了统一访问的原则 egon. ...