cf round340 div2 F(莫队)
来源:互联网 发布:阿里云短信接口开发 编辑:程序博客网 时间:2024/05/22 03:26
题目链接:传送门
题目大意:
给你一个序列a,和m次询问,和一个数k,每次询问你一个区间[l,r],问你在这个区间中有多少对i,j使得区间[i,j]的异或和等于k
题目思路:
首先考虑区间异或和,我们可用个数组pre[i] 表示前i个数的异或和,通过异或的性质我们可以求出i,j的异或和为pre[j]^pre[i-1]
有了这个我们还可以用个数组flag[i]表示当前这个 数i出现的次数,有了这些,如果我们知道了[i,j]的答案,那么我们可以在
O(1)的时间内求出[i-1][j],[i+1][j],[i][j-1],[i][j+1]内的值,所以有了这个我们就很好想到莫队,莫队的复杂度为m*sqrt(n)
关于莫队可以看这个博客:莫队详解
首先我们将区间分块,然后按快排序,然后对于我知道区间[L,R]的答案来求查询区间[l,r]的答案,这里可以做到
总复杂度为m*sqrt(n)
AC代码:
#include<bits/stdc++.h>using namespace std;const int maxn = 1<<20;struct node{ int l,r,id;}q[maxn];int a[maxn],pos[maxn];int n,m,k,L=1,R=0;long long Ans=0,flag[maxn],ans[maxn];bool cmp(node a,node b){ if(pos[a.l]==pos[b.l]) return a.r<b.r; else return pos[a.l]<pos[b.l];}void add(int x){ Ans+=flag[a[x]^k]; flag[a[x]]++;}void del(int x){ flag[a[x]]--; Ans-=flag[a[x]^k];}int main(){ scanf("%d%d%d",&n,&m,&k); int sz = sqrt(n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); a[i] = a[i]^a[i-1]; pos[i] = i/sz; } for(int i=1;i<=m;i++) { scanf("%d%d",&q[i].l,&q[i].r); q[i].id = i; } sort(q+1,q+1+m,cmp); flag[0] = 1; for(int i=1;i<=m;i++) { while(L<q[i].l) { del(L-1); L++; } while(L>q[i].l) { L--; add(L-1); } while(R<q[i].r) { R++; add(R); } while(R>q[i].r) { del(R); R--; } ans[q[i].id] = Ans; } for(int i=1;i<=m;i++) cout<<ans[i]<<endl; return 0;}
阅读全文
0 0
- cf round340 div2 F(莫队)
- Codeforce round340 div2
- CF 183(div2)
- CF 162(div2)
- CF 174(div2) C
- CF 171(div2)A
- CF 171 (div2)C
- CF 170(div2)B
- CF #190(DIV2)总结
- cf#383 div2(ABCDE)
- CF 179(div2)D(floyed)
- CF 177(div2) E(greedy )
- CF 103div2 D(dijkstra)
- CF round 419 (div2)C题
- cf 131 DIV2 B
- CF #148 DIV2 E
- CF #137 DIV2
- CF 149 div2感想
- mysql性能优化 整理
- 重读网峰A8文档---之---USB摄像头(V4l2简要分析部分)
- php文件存储时的编码格式--utf8无BOM
- 入门视频采集与处理(BT656简介)
- Kotlin学习笔记——标准库kotlin.io
- cf round340 div2 F(莫队)
- CSS样式——中
- Android 6.0 运行时权限
- 爬虫登录知乎
- 2.1-全栈Java笔记:编程的基本概念
- avalonjs双向数据绑定与监听
- 网络爬虫全解析(JAVA)--目录
- Python2 Mysql连接远程数据库
- Android中Rect和RectF的区别