6759: 异或序列
6759: 异或序列
时间限制: 1 Sec 内存限制: 128 MB
题目描述
输入
输出
样例输入
4 5 1 1 2 3 1 1 4 1 3 2 3 2 4 4 4
样例输出
4 2 1 2 1
提示
对于30%的数据,1≤n,m≤1000。
对于100%的数据,1≤n,m≤105,0≤k,ai≤105,1≤lj≤rj≤n。
来源/分类
重庆OI2018
看到多次区间查询,就想到了莫队算法,但是莫队中对于区间状态转移的处理却是需要斟酌。
题目已经很明显的提示了,异或异或,也许我们应该使用异或前缀和,(orz)
对于异或前缀和 我们知道 i and j 之间的异或和 == sum[j]^sum[i-1]
那么对于l 如果小于 Q.l-1,那么我们就先清除这位置的影响,然后下标++
如果大于Q.l-1,那就下标--,再加上这位置影响
我们要让求异或为k的组合数
sum[j] ^ sum[i] = k 即 sum[j] ^ k = sum[i]
用cnt 记录 区间内前缀和的数量变化
那么ans += val * (cnt[sum[j] ^ k])即这个点所造成的k组数影响
1 #include<iostream> 2 #include<cstdio> 3 #include<math.h> 4 #include<algorithm> 5 using namespace std; 6 7 const int maxn = 1e5+5; 8 int n,m,k; 9 int block; 10 int sum[maxn]; 11 int ans; 12 int tmp; 13 int cnt[maxn]; 14 15 struct node 16 { 17 int l,r,id,ans; 18 friend bool operator < (const node &a,const node&b) 19 { 20 if(a.l / block != b.l / block)return a.l < b.l; 21 return a.r < b.r; 22 } 23 node(){} 24 node(int l,int r,int id):l(l),r(r),id(id){} 25 }Q[maxn]; 26 27 bool cmp(node a,node b) 28 { 29 return a.id < b.id; 30 } 31 32 void revise(int x,int val) 33 { 34 cnt[sum[x]]+=val; 35 ans += val*cnt[sum[x]^k]; 36 } 37 int main() 38 { 39 scanf("%d%d%d",&n,&m,&k); 40 block = sqrt(n); 41 for(int i=1;i<=n;i++) 42 { 43 scanf("%d",&tmp); 44 sum[i] = tmp ^ sum[i-1]; 45 } 46 for(int i=1;i<=m;i++) 47 { 48 scanf("%d%d",&Q[i].l,&Q[i].r); 49 Q[i].id = i; 50 } 51 sort(Q+1,Q+m+1); 52 int l = 1,r = 0; 53 ans = 0; 54 for(int i=1;i<=m;i++) 55 { 56 while(l < Q[i].l - 1)revise(l,-1),l++; 57 while(l > Q[i].l - 1) l--,revise(l,1); 58 while(r < Q[i].r)r++,revise(r,1); 59 while(r > Q[i].r)revise(r,-1),r--; 60 Q[i].ans = ans; 61 } 62 sort(Q+1,Q+m+1,cmp); 63 for(int i=1;i<=m;i++)printf("%d\n",Q[i].ans); 64 return 0; 65 }
View Code
转载于:https://www.cnblogs.com/iwannabe/p/9539460.html
6759: 异或序列相关推荐
- [CQOI2018]异或序列
[CQOI2018]异或序列 题意: 给定1个整数K,离线询问[l,r]中有多少子区间xor和=K. 题解: 异或有个重要的性质:它的逆运算就是自身 我们维护该数列的前缀异或和a[x],表示1到x的区 ...
- Loj 2534 异或序列
Loj 2534 异或序列 考虑莫队离线处理.每加一个数,直接询问 \(a[x]\oplus k\) 的前/后缀数目即可,减同理. 利用异或的优秀性质,可以维护异或前缀和,容易做到每次 \(O(1)\ ...
- luogu4462 异或序列
题目大意 给出n,m,k,有n个数的序列,m次询问一段区间,问异或和等于K的子区间的个数. 题解 本题一看就是莫队.但要解决该题需要以下性质: 定理: $$a\oplus b=c\Leftrighta ...
- [CQOI2018] 异或序列
题目链接:戳我 哈哈哈我竟然秒切了省选题 莫队+异或. 考虑异或的性质,一个数同时异或两次等于没有进行操作.那么我们设a[i]为前i个数的异或和,显然对于一个区间\([l,now]\),\(a[l-1 ...
- BZOJ5301:[CQOI2018]异或序列——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5301 https://www.luogu.org/problemnew/show/P4462 已知 ...
- 【Luogu】P4462异或序列(莫队)
题目链接 观察什么时候x到y之间那一段可以被统计 xorsum[x-1]^xorsum[y]=k xorsum[x-1]=xorsum[y]^k||xorsum[y]=xorsum[x-1]^k 莫队 ...
- 【LOJ】#2534. 「CQOI2018」异或序列
题解 每个数都处理成前缀和,就相当于问\([l - 1,r]\)有几个数对\(x,y\),\(sum[x] ^ sum[y] = k\) 直接莫队即可 代码 #include <bits/std ...
- 洛谷 P4551 最长异或路径
题目描述 给定一棵 nn 个点的带权树,结点下标从 11 开始到 NN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有节点权值的异或. 输入输出格式 输入格式: ...
- 01tire+洛谷P4551 最长异或路径
题目: 给定一棵n个点的带权树,结点下标从1开始到N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入格式 第一行一个整数NN,表示点数. 接下来 ...
最新文章
- 两个软件相互交换数据_面试需要知道的六种数据结构
- MySQL5.7.11免安装版的安装和配置以及解决MYSQL服务无法启动问题
- android activity使用,android,NativeActivity使用
- 虚幻4皮肤材质_虚幻4渲染编程(材质编辑器篇)【第六卷:各向异性材质amp;玻璃材质】...
- 微信小程序 引用其他js里的方法
- 精简DropDownList用法
- zk里面调用javascript方法
- html引用单文件组件,webpack入坑之旅(五)加载vue单文件组件_html/css_WEB-ITnose
- 让部署到服务器上的springboot项目持续运行(nohup)
- mysql hibernate 乱码_mysql hibernate 乱码
- WARNING:CPU :2 PID:593 at net/wireless/nl802.c:2883 nl80211_send_chandef+0x54/0x180
- 虚拟机下搭建一个dns服务器,虚拟机下DNS服务器配置.doc
- mysql怎么打开db文件_myMySQL数据库的db文件怎么打开? MySQL数据库使用教程
- 常用 Linux 软件汇总!很全,但不敢说最全
- python 使用 turtle库 画“皮卡丘”
- AllegroPCB里面设置好颜色,光绘文件artwork和其他板子相关参数怎么重复应用到其他板子里面
- 恒压板框过滤实验数据处理_求购二手板框压滤机现金回收 回收二手板框压滤机回收价格...
- NRFL2401学习
- 两层循环终止内层或外层循环的方法(break和continue的用法)
- 拯救者r720黑苹果_拯救级手游语音,大象声科助力联想拯救者电竞手机