BZOJ 3339: Rmq Problem 莫队算法

3339: Rmq Problem

题目连接:

http://www.lydsy.com/JudgeOnline/problem.php?id=3339

Description

n个数,m次询问l,r。查询区间mex是什么.

Input

Output

Sample Input

7 5

0 2 1 0 1 3 2

1 3

2 3

1 4

3 6

2 7

Sample Output

3

0

3

2

4

Hint

题意

题解:

莫队算法水题

直接暴力搞就行了

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000005;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int a[maxn],pos[maxn],c[maxn],Ans[maxn];
int ans,n,m;
struct query
{
    int l,r,id;
}Q[maxn];
bool cmp(query a,query b)
{
    if(pos[a.l]==pos[b.l])
        return a.r<b.r;
    return pos[a.l]<pos[b.l];
}
void Update(int x)
{
    c[x]++;
    if(ans==x)
        while(c[ans])
            ans++;
}
void Delete(int x)
{
    c[x]--;
    if(c[x]==0&&x<ans)ans=x;
}
int main()
{
    n=read(),m=read();
    int sz =ceil(sqrt(1.0*n));
    for(int i=1;i<=n;i++)
    {
        a[i]=read();
        pos[i]=(i-1)/sz;
    }
    for(int i=1;i<=m;i++)
    {
        Q[i].l=read();
        Q[i].r=read();
        Q[i].id = i;
    }
    sort(Q+1,Q+1+m,cmp);
    int L=1,R=0;ans=0;
    for(int i=1;i<=m;i++)
    {
        int id = Q[i].id;
        while(R<Q[i].r)R++,Update(a[R]);
        while(L>Q[i].l)L--,Update(a[L]);
        while(R>Q[i].r)Delete(a[R]),R--;
        while(L<Q[i].l)Delete(a[L]),L++;
        Ans[id]=ans;
    }
    for(int i=1;i<=m;i++)
        printf("%d\n",Ans[i]);
}
posted @ 2016-08-22 11:16  qscqesze  阅读(588)  评论(0编辑  收藏  举报