【树状数组】区间出现偶数次数的异或和(区间不同数的异或和)@ 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的更多相关文章

  1. Codeforces Round #590 (Div. 3)【D题:26棵树状数组维护字符出现次数】

    A题 题意:给你 n 个数 , 你需要改变这些数使得这 n 个数的值相等 , 并且要求改变后所有数的和需大于等于原来的所有数字的和 , 然后输出满足题意且改变后最小的数值. AC代码: #includ ...

  2. 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 ...

  3. 树状数组区间修改and查询和

    在差分数组上稍加改变,就可以实现这个骚操作 首先我们先来看一看普通的树状数组(基于差分)怎么暴力的求解区间和就是询问区间长度次和 \(\sum^{i=1}_{len}\sum^{j=1}_{i}bas ...

  4. 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间

    从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...

  5. 【bzoj3289】Mato的文件管理 离散化+莫队算法+树状数组

    原文地址:http://www.cnblogs.com/GXZlegend/p/6805224.html 题目描述 Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份 ...

  6. 【序列操作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 ...

  7. 树状数组 && 板子

    本文树状数组讲解转载于:https://www.cnblogs.com/xenny/p/9739600.html 本文新加内容为模板代码部分 1.什么是树状数组? 顾名思义,就是用数组来模拟树形结构呗 ...

  8. 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] ...

  9. BZOJ 1878: [SDOI2009]HH的项链 离线树状数组

    1878: [SDOI2009]HH的项链 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  10. BZOJ 3333 排队计划 树状数组+线段树

    题目大意:给定一个序列.每次选择一个位置,把这个位置之后全部小于等于这个数的数抽出来,排序,再插回去,求每次操作后的逆序对数 首先我们每一次操作 对于这个位置前面的数 因为排序的数与前面的数位置关系不 ...

随机推荐

  1. 分布式监控系统开发【day38】:主机存活检测程序解析(七)

    一.目录结构 二.入口 1.文件MonitorServer.py import os import sys if __name__ == "__main__": os.enviro ...

  2. 金融量化分析【day110】:金融基础知识

    一.股票 股票: 股票是股份公司发给出资人的一种凭证,股票的持有者就是股份公司的股东. 股票的面值与市值 面值表示票面金额 市值表示市场价值 上市/IPO: 企业通过证券交易所公开向社会增发股票以募集 ...

  3. 第八节:Task的各类Task<TResult>返回值以及通用线程的异常处理方案。

    一. Task的各种返回值-Task<TResult> PS: 在前面章节,我们介绍了Task类开启线程.线程等待.线程延续的方式,但我们并没有关注这些方式的返回值,其实他们都是有返回值的 ...

  4. 14、使用csv和excel存储豆瓣top250电影信息

        记得我们第三关的时候爬取了豆瓣TOP250的电影名/评分/推荐语/链接,现在呢,我们要把它们存储下来,记得用今天课上学的csv和excel,分别存储下来哦-       URL     htt ...

  5. 使用kqueue的str_cli函数

    void str_cli(FILE *fp, int sockfd) { , isfile; char buf[MAXLINE]; ]; struct timespec ts; struct stat ...

  6. input全选和取消全选

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...

  7. adb devices 报错处理

    手机连接pc,cmd窗口输入命令adb devices报如下错误: adb server version (31) doesn't match this client (40)然后adb停止运行 这是 ...

  8. IEnumerable<T>和IQueryable<T>区别

    LINQ查询方法一共提供了两种扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了IEnumerable<T>接口的集合进行扩展:Queryab ...

  9. 将DataTable转换为List<T>对象遇到问题:类型“System.Int64”的对象无法转换为类型“System.Int32”。

    可以利用反射将DataTable转换为List<T>对象:原始链接http://www.jb51.net/article/67386.htm 但是该方法在DataTable里某个字段类型是 ...

  10. vue的配置环境篇

    1.电脑已经安装的nodejs和webpack. 2.1)打开cmd.win+r.可以直接输入node -v查看版本.安装淘宝镜像  npm install -g cnpm --registry=ht ...