SPOJ - DQUERY (莫队模板代码)

版权声明:转载请告知博主并要注明出处嗷~ https://blog.csdn.net/Akatsuki__Itachi/article/details/82019705

题目链接

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define memset(a,v)  memset(a,v,sizeof(a))
#define eps 1.0E-8
using namespace std;
const int MAXL(1e6);
const int INF(0x3f3f3f3f);
const int mod(1e9+7);
typedef long long int LL;
int cnt[MAXL+50];
int a[MAXL+50];
int res[MAXL+50];
int block;
int ans=0;
struct node
{
    int l,r,order;
    bool operator < (const node &cmp)const{
        return l/block==cmp.l/block ? r<cmp.r : l/block<cmp.l/block;
    }
}s[MAXL+50];
void add(int i)
{
    cnt[a[i]]++;
    if(cnt[a[i]]==1)
        ans++;
}
void del(int i)
{
    cnt[a[i]]--;
    if(cnt[a[i]]==0)
        ans--;
}
int main()
{
    int n,m;
    scanf("%d",&n);
    block=sqrt(n);
    for(int i=1;i<=n;i++)
        scanf("%d",a+i);
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&s[i].l,&s[i].r);
        s[i].order=i;
    }
    sort(s+1,s+m+1);
    int L=s[1].l,R=L-1;
    for(int i=1;i<=m;i++)
    {
        while(R<s[i].r) add(++R);
        while(L>s[i].l) add(--L);
        while(L<s[i].l) del(L++);
        while(R>s[i].r) del(R--);
        res[s[i].order]=ans;
    }
    for(int i=1;i<=m;i++)
        printf("%d\n",res[i]);
}

猜你喜欢

转载自blog.csdn.net/Akatsuki__Itachi/article/details/82019705
今日推荐