【BZOJ】【P3339&P3585】【Rmq Problem/mex】【题解】【离线】
2014-05-15 23:43
375 查看
传送门:www.lydsy.com/JudgeOnline/problem.php?id=3339
www.lydsy.com/JudgeOnline/problem.php?id=3585
双倍福利题……看到这道题YY了很久也没YY出正解……
首先从1到i的mex好求吧,那就求出来,再预处理一下每个数的下一个数的位置是多少
你发现你已经能回答l==1的询问了 = = 、,那么怎样才能由i推到i+1呢?
从i到i+1的变化就是取消了a[i]的影响,也就是说[i,next[i]-1]的mex=min(mex,a[i])考虑到mex是单调的,倒着更新就好了
于是你又可以回答以l==i+1结尾的询问了……于是离线做就好了……真是巧妙啊……
PS:明天就要去二轮了,话说说Bless All的都跪了……我就不说了,希望自己Rp++ 吧
Code:
www.lydsy.com/JudgeOnline/problem.php?id=3585
双倍福利题……看到这道题YY了很久也没YY出正解……
首先从1到i的mex好求吧,那就求出来,再预处理一下每个数的下一个数的位置是多少
你发现你已经能回答l==1的询问了 = = 、,那么怎样才能由i推到i+1呢?
从i到i+1的变化就是取消了a[i]的影响,也就是说[i,next[i]-1]的mex=min(mex,a[i])考虑到mex是单调的,倒着更新就好了
于是你又可以回答以l==i+1结尾的询问了……于是离线做就好了……真是巧妙啊……
PS:明天就要去二轮了,话说说Bless All的都跪了……我就不说了,希望自己Rp++ 吧
Code:
#include<map> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int maxn=200010; int mex[maxn],a[maxn],next[maxn]; map<int,int>mp; int n,m; void pre(){ for(int i=1;i<=n;i++){ if(mp.count(a[i])) next[mp[a[i]]]=i-1; else next[mp[a[i]]]=n; mp[a[i]]=i; }mp.clear(); int minn=0; if(a[1]==0)minn++; mex[1]=minn;mp[a[1]]=1; for(int i=2;i<=n;i++){ mp[a[i]]=1; while(mp[minn])minn++; mex[i]=minn; } } int getint(){ int res=0,ok=0;char ch; while(1){ ch=getchar(); if(isdigit(ch)){ res*=10;res+=ch-'0';ok=1; }else if(ok)break; }return res; } void change(int x){ int val=a[x]; mex[x]=0; int end=next[x]; if(end==0)end=n; for(int i=end;i>x;i--) if(mex[i]>val) mex[i]=val; else break; } struct qes{ int ind,l,r; bool operator < (const qes &a)const{ return l<a.l||a.l==l&&r<a.r; } }; qes q[maxn]; int anss[maxn]; int main(){ n=getint();m=getint(); for(int i=1;i<=n;i++)a[i]=getint(); pre(); for(int i=1;i<=m;i++){ q[i].ind=i;q[i].l=getint();q[i].r=getint(); }sort(q+1,q+1+m); int last=1; for(int i=1;i<=m;i++){ if(q[i].l==last){ anss[q[i].ind]=mex[q[i].r]; }else{ for(int j=last;j<q[i].l;j++) change(j); anss[q[i].ind]=mex[q[i].r]; } last=q[i].l; } for(int i=1;i<=m;i++) printf("%d\n",anss[i]); return 0; }
相关文章推荐
- BZOJ3339:Rmq Problem & BZOJ3585 & 洛谷4137:mex——题解
- 【BZOJ】3339: Rmq Problem & 3585: mex(线段树+特殊的技巧)
- BZOJ 3339/3585 Rmq Problem/mex 莫队算法
- bzoj 3585: mex && 3339: Rmq Problem -- 主席树
- BZOJ_3585_mex && BZOJ_3339_Rmq Problem_莫队+分块
- [bzoj 3339&bzoj 3585]Rmq Problem&mex
- [BZOJ3339] Rmq Problem&&[BZOJ3585] mex
- bzoj3489 A simple rmq problem
- Luogu4137:Rmq Problem/mex
- bzoj 3489: A simple rmq problem k-d树思想大暴力
- [bzoj3489]A simple rmq problem
- BZOJ 3489 A simple rmq problem ——KD-Tree
- BZOJ 3339: Rmq Problem 莫队水题
- 【BZOJ3489】A simple rmq problem kd-tree
- 【31.94%】【BZOJ 3489】A simple rmq problem
- [BZOJ 3489] A simple rmq problem 【可持久化树套树】
- Luogu4137:Rmq Problem/mex
- [BZOJ]3489 A simple rmq problem 主席树套树
- BZOJ3212 Pku3468 A Simple Problem with Integers 题解
- BZOJ 3489 A simple rmq problem