CF703D Mishka and Interesting sum(求区间出现次数偶数次数的异或和)
题意: 给定 n 个数的序列 a。m 次操作。操作有一种:
求 al到ara_l到a_ral到ar 中,出现偶数次的数的异或和。
n,q<=1e6,a[i]<=1e9n,q<=1e6, a[i]<=1e9n,q<=1e6,a[i]<=1e9
题解: 因为本题求得是出现次数为偶数次数的异或和,我们可以知道,两个相同的数异或和为0,那么区间l-r之间的异或和即为出现次数为奇数个数数的异或和,这样我们再求一下区间l-r中不同数的异或和(树状数组老套路),用着两个异或和既可以求出答案。
代码:
#include<bits/stdc++.h>
using namespace std;const int maxn=1e6+10;int c[maxn],cc[maxn];
int a[maxn];int lowbit(int x){return x&(-x);
}
struct edge{int l,r,id;bool operator<(const edge & a)const{return r<a.r;}
}pp[maxn];
int n;
void update1(int i,int x){while(i<=n){c[i]^=x;i+=lowbit(i);}
}
int query1(int i){int res=0;while(i>0){res^=c[i];i-=lowbit(i);}return res;
}int ans[maxn],b[maxn],pos[maxn];
int pre[maxn];
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);b[i]=a[i];}int q;scanf("%d",&q);for(int i=1;i<=q;i++){//int l,r;scanf("%d %d",&pp[i].l,&pp[i].r);pp[i].id=i;}sort(pp+1,pp+1+q);sort(b+1,b+1+n);int m=unique(b+1,b+1+n)-b-1;int posnow=1;for(int i=1;i<=n;i++){int xxx=lower_bound(b+1,b+m+1,a[i])-b;if(pos[xxx]==0){update1(i,a[i]);}else{update1(pos[xxx],a[i]);update1(i,a[i]);}pos[xxx]=i;pre[i]=pre[i-1]^a[i];while(pp[posnow].r==i){//cout<<posnow<<endl;int x=query1(pp[posnow].r)^query1(pp[posnow].l-1);int y=pre[pp[posnow].r]^pre[pp[posnow].l-1];ans[pp[posnow].id]=x^y;//cout<<"debug "<<x<<" "<<y<<endl;posnow++;}//cout<<x^y<<endl;}for(int i=1;i<=q;i++){printf("%d\n",ans[i]);}
}
CF703D Mishka and Interesting sum(求区间出现次数偶数次数的异或和)相关推荐
- Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum (离线树状数组+前缀xor)
题目链接:http://codeforces.com/contest/703/problem/D 给你n个数,m次查询,每次查询问你l到r之间出现偶数次的数字xor和是多少. 我们可以先预处理前缀和X ...
- 快速求区间和的有趣算法——树状数组
好久没写东西,感觉有写些什么的必要了.(高仿鲁迅) 树状数组虽然听起来名字高大上,但是不是很难(前缀和是名字高大上,却水得像海洋) 树状数组在单纯的查询一个区间的和和修改某一个数的效率要超过线段树哦! ...
- 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间
从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...
- Median断点法求区间-匹配-memset数组与vector
Sample Input 3 4 4 2 4 3 1 4 3 1 3 4 4 3 2 3 4 Sample Output YES YES NO 题意 : 将1 - n的n个整数分成m个集合,满足第i个 ...
- [蓝桥杯][2016年第七届真题]压缩变换(主席树求区间不同数的个数)
题目描述 小明最近在研究压缩算法. 他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比. 然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这些序列的特点是,后面 ...
- Greedy Sequence(2019南京icpc网络预选赛)主席树求区间小于k的最大值
题意:给出n个整数,构造s1,s2,s3-sn s1,s2,s3-sns1,s2,s3-sn,si sisi满足五个条件 1.s1[i]=i s1[i]=is1[i]=i 2.对于1<j< ...
- D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)
English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...
- zoj 2112 树状数组 套主席树 动态求区间 第k个数
总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...
- hud 3874 求区间内不同数字的和
http://acm.hdu.edu.cn/showproblem.php?pid=3874 和求区间内不同数字的个数一样. //#include<bits/stdc++.h> //usi ...
最新文章
- redis 判断存在性_Redis如何保证接口的幂等性?
- cmd系统命令不识别
- 用MyEclipse自动生成hibernate映射文件和实体类
- 在win8上配置网站服务器,win8怎么配置web服务器地址
- 软键盘挡住EditText
- linux lsm 程序加载钩函数,LSM在Linux中的实现方式
- jq fileupload 设置最大文件大小5m_捷达将发布全新中大型SUV 或命名VS9/车长超5m
- 设计模式---观察者模式介绍与理解
- 大话IT第13期:2011年云计算市场年中盘点
- python 读取元组对的key_Python基本认识基本类型
- Poj(1182),种类并查集
- K均值算法(K_means)
- win10锁定计算机命令,win10怎么锁定磁盘 锁住win10计算机磁盘的操作步骤
- vue3.0在mian.js中引入全局less
- 1、NetBIOS简介
- WhatsApp聊天记录迁移新手机,备份如何找回和删除?
- [安卓开发] Android 自己做双向手电筒 源代码
- 数据压缩读书笔记——线性代数的几何意义(五)
- 计算机语言python-一、计算机语言与python简介
- cmd启动MySQL服务显示服务名无效,MySQL服务无法启动 Java