BZOJ 3585 mex 莫队算法+分块
来源:互联网 发布:js根据name赋值 编辑:程序博客网 时间:2024/06/05 17:56
3585: mex
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 973 Solved: 513
Description
有一个长度为n的数组{a1,a2,…,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。
Input
第一行n,m。
第二行为n个数。
从第三行开始,每行一个询问l,r。
Output
一行一个数,表示每个询问的答案。
Sample Input
5 5
2 1 0 2 1
3 3
2 3
2 4
1 2
3 5
Sample Output
1
2
3
0
3
HINT
数据规模和约定
对于100%的数据:
1<=n,m<=200000
0<=ai<=109
1<=l<=r<=n
对于30%的数据:
1<=n,m<=1000
Source
By 佚名提供
这道题我原来应该发过一篇主席树的题解~~
#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int M = 200200;struct Data{ int l,r,id; bool operator < (const Data &x) const;}q[M];int n,m,belong[M],l[M],r[M],a[M],L=1,R=0;int f[M],block_ans[M],ans[M],block;inline int read(){ int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){ x=(x<<1)+(x<<3)+(c-'0'); c=getchar(); } return x*f;}bool Data :: operator < (const Data &x) const{ if(belong[l]!=belong[x.l]) return l<x.l; return r<x.r;}inline void UpDate(int x){ if(x>n) return ; if(!f[x]++) block_ans[belong[x]]++;}inline void DnDate(int x){ if(x>n) return ; if(!--f[x]) block_ans[belong[x]]--;}inline int Query(){ int i; if(!f[0]) return 0; for(i=1;l[i];i++) if(block_ans[i]!=r[i]-l[i]+1) break; int temp=i; for(i=l[temp];i<=r[temp];i++) if(!f[i]) return i; return n;}int main(){ scanf("%d%d",&n,&m); block=int(sqrt(n)+1e-7); for(int i=1;i<=n;i++) belong[i]=(i-1)/block+1; for(int i=1;(i-1)*block+1<=n;i++) l[i]=(i-1)*block+1,r[i]=min(i*block,n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); 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+n); for(int i=1;i<=m;i++){ while(R<q[i].r) UpDate(a[++R]); while(R>q[i].r) DnDate(a[R--]); while(L<q[i].l) DnDate(a[L++]); while(L>q[i].l) UpDate(a[--L]); ans[q[i].id]=Query(); L=q[i].l;R=q[i].r; } for(int i=1;i<=m;i++) printf("%d\n",ans[i]); return 0;}
阅读全文
0 0
- BZOJ 3585 mex 莫队算法+分块
- BZOJ 3585 mex 莫队算法+分块
- BZOJ 3585 mex 莫队算法+分块
- BZOJ 3585: mex|莫队算法
- 【bzoj3585】mex 分块+莫队算法
- bzoj3585 mex 分块+莫队算法
- BZOJ 3339/3585 Rmq Problem/mex 莫队算法
- jzoj 3547. 【清华集训2014】mex 分块+莫队算法
- bzoj 3781: 小B的询问 莫队算法+分块
- bzoj 3236: [Ahoi2013]作业 莫队算法+分块
- BZOJ-3757 苹果树 LCA 莫队算法 树分块
- bzoj 3585: mex
- bzoj-3585 mex
- [BZOJ 3585]mex
- bzoj 3585: mex
- bzoj 3585: mex
- BZOJ 3585 mex
- 分块、莫队算法
- Log.isLoggable之二源码解析
- VR视频为什么都是弯的?|VR知识
- 表单校验
- 从32位QT开发环境拷贝vs-qt的工程到64位工程中遇到的问题
- 【Spring 核心】(2):AOP的实现
- BZOJ 3585 mex 莫队算法+分块
- Mac系统如何隐藏Dock上的图标
- VS 2015配置OpenCV3.2编译环境
- Ubuntu系统下切换Openjdk7和Openjdk8
- 【算法题】求二叉树所有节点的左右子树的绝对值差的和
- 1224: 矩阵翻转
- Android中SimpleAdapter,BaseAdapte详解
- 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数
- 求一个数组中第k大的数方法