求助莫队
查看原帖
求助莫队
171487
cmll02楼主2021/2/9 08:53

RT,卡72过不去了……

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <time.h>
#define int long long
char buf[1<<23],*p1=buf,*p2=buf,obuf[1<<23],*O=obuf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
inline int read()
{
	int num = 0,f=1; char c = getchar();
	while (c<48 || c>57)f=(c=='-'?-1:f),c = getchar();
	while (c >= 48 && c <= 57)num = (num << 3) + (num << 1) + (c ^ 48), c = getchar();
	return num*f;
};
int ans; 
const int B=2300;
int a[1000005],b[1000005],c[1000005];
struct qaq{
	int l,r,i;
	bool operator<(const qaq& b)const
	{
		return (l/B==b.l/B)?r<b.r:l<b.l;
	}
}q[1000005];
inline void add(int k)
{
	(b[a[k]]++)?0:ans++;
}
inline void rmv(int k)
{
	(--b[a[k]])?0:ans--;
}
signed main()
{
	int n=read();
	for(int i=1;i<=n;i++)a[i]=read();
	int m=read();
	for(int i=1;i<=m;i++)q[i].l=read(),q[i].r=read(),q[i].i=i;
	std::sort(q+1,q+1+m);
	int cl=1,cr=0;
	for(int i=1;i<=m;i++)
	{
		int L=q[i].l,R=q[i].r;
		while(cl<L)rmv(cl++);
		while(cl>L)add(--cl);
		while(cr>R)rmv(cr--);
		while(cr<R)add(++cr);
		c[q[i].i]=ans;
	}
	for(int i=1;i<=m;i++)printf("%d\n",c[i]);puts("");
}
2021/2/9 08:53
加载中...