莫队

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=250005;
//const int M=200005;
int n,m,a[N],s[N],belong[N],ans[N],color=0;
struct q{int l,r,id;}t[N];
int u[1000005];
bool cmp(q x,q y)
{
    if(belong[x.l]==belong[y.l]) return x.r<y.r;
    return x.l<y.l;
}
int Ans=0;
int main()
{
    memset(u,0,sizeof(u));
    memset(s,0,sizeof(s));
    scanf("%d",&n);int k=(int)(sqrt(n));
    for(int i=1;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        if(u[x]==0)
        {
            a[i]=++color;
            u[x]=a[i];
        }
        else a[i]=u[x];
    }//离散化
    for(int i=1;i<=n;i++) belong[i]=(i-1)/k+1;
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&t[i].l,&t[i].r);
        t[i].id=i;
    }
    sort(t+1,t+1+m,cmp);
    int l=1,r=0;
    for(int i=1;i<=m;i++)
    {
        while(l<t[i].l)
        {
            if(s[a[l]]==1) Ans--;
            s[a[l]]--;
            l++;
        }
        while(r>t[i].r)
        {
            if(s[a[r]]==1) Ans--;
            s[a[r]]--;
            r--;
        }
        while(l>t[i].l)
        {
            l--;
            if(s[a[l]]==0) Ans++;
            s[a[l]]++;
        }
        while(r<t[i].r)
        {
            r++;
            if(s[a[r]]==0) Ans++;
            s[a[r]]++;
        }
        ans[t[i].id]=Ans;
    }
    for(int i=1;i<=m;i++) printf("%d ",ans[i]);
}

原文地址:https://www.cnblogs.com/lmjer/p/8543606.html