背景:
又检查了好久的代码…
题目传送门:
https://www.luogu.org/problemnew/show/P4137
题意:
询问若干个区间,求每一个区间内最小的没有出现过的自然数。
思路:
直接暴力用莫队吧。
好像不会证时间复杂度。
代码:
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,now=0;
int p[200010],block[200010],hsh[200010],ans[200010];
struct node{int x,y,id;} a[200010];
bool cmp(node x,node y)
{
return block[x.x]==block[y.x]?x.y<y.y:x.x<y.x;
}
int getmin(int start)
{
for(int i=start;;i++)
if(!hsh[i]) return i;
}
void move(int x,int d)
{
if(x>n) return;
hsh[x]+=d;
if(d==1)
{
now=getmin(now);
}
else
{
if(!hsh[x]) now=min(now,x);
}
}
int main()
{
scanf("%d %d",&n,&m);
int u=sqrt(n);
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
block[i]=(i-1)/u+1;
}
for(int i=1;i<=m;i++)
{
scanf("%d %d",&a[i].x,&a[i].y);
a[i].id=i;
}
sort(a+1,a+m+1,cmp);
int l=1,r=0;
for(int i=1;i<=m;i++)
{
while(l>a[i].x) move(p[--l],1);
while(r<a[i].y) move(p[++r],1);
while(l<a[i].x) move(p[l++],-1);
while(r>a[i].y) move(p[r--],-1);
ans[a[i].id]=now;
}
for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
}