BZOJ1878[SDOI2009]HH的项链+莫队算法模板

时间:2023-03-09 05:52:26
BZOJ1878[SDOI2009]HH的项链+莫队算法模板

题意:多次询问,求在一个区间中,有多少种珠子;

思路:莫队算法模板题目;

参考:https://www.cnblogs.com/RabbitHu/p/MoDuiTutorial.html

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std; const int Block = ,maxn = ,maxm = ;
int a[maxn],cnt[],ans[maxm],sum=;
#define bel(x) ((x-1)/Block + 1) struct node{
int id,l,r;
}q[maxm];
bool cmp (node a,node b)
{
if(bel(a.l)==bel(b.l))
return a.r<b.r;
return bel(a.l) < bel(b.l);
}
void del (int x)
{
cnt[x] --;
if(!cnt[x])sum--;
}
void add (int x)
{
if(cnt[x]==)sum++;
cnt[x] ++;
} int main(){
int n,m;
scanf("%d",&n);
for(int i=; i<=n; i++)scanf("%d", &a[i]);
scanf("%d",&m);
for(int i=; i<=m; i++)
{
scanf("%d%d", &q[i].l, &q[i].r);
q[i].id = i;
}
sort(q+,q++m,cmp);
int ql = ,qr = ;
for(int i=; i<=m; i++)
{
while(ql < q[i].l) del(a[ql++]);
while(ql > q[i].l) add(a[--ql]);
while(qr < q[i].r) add(a[++qr]);
while(qr > q[i].r) del(a[qr--]);
ans[q[i].id] = sum;
}
for(int i=; i<=m; i++)
printf("%d\n", ans[i]); return ;
}