求助莫队
查看原帖
求助莫队
227923
MasQx楼主2021/3/15 18:45

TLE 卡在72分过不去

#include<iostream>
#include<algorithm>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#define ll long long
#define INF 0x3fffffff
using namespace std;
const int N=1e6+10;
struct Q
{
	int l,r,k,block;
}qwq[N];
int n,m,a[N],pos[N],cnt[N];
ll ans[N],res;
ll read()
{
	ll x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9') {x=x*10+c-'0',c=getchar();}
	return x*f;
}
inline bool cmp(Q x,Q y){return (x.block)^(y.block)?x.l<y.l:(((x.block)&1)?x.r<y.r:x.r>y.r);}
void Add(int n){if(++cnt[a[n]]==1) ++res;}
void Sub(int n){if(--cnt[a[n]]==0) --res;}
signed main()
{
	n=read();
	int siz=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
	}
	m=read();
	for(int i=0;i<m;i++)
	{
		qwq[i].l=read();
		qwq[i].r=read();
		qwq[i].k=i;
		qwq[i].block=(qwq[i].l-1)/siz/2+1;
	}
	sort(qwq,qwq+m,cmp);
	int l=1,r=0;
	for(int i=0;i<m;i++)
	{
		while(qwq[i].l<l) Add(--l);
		while(qwq[i].r>r) Add(++r);
		while(qwq[i].l>l) Sub(l++);
		while(qwq[i].r<r) Sub(r--);
		ll k=qwq[i].r-qwq[i].l+1;
		ans[qwq[i].k]=res;
	}
	for(int i=0;i<m;i++)
	{
		cout <<ans[i]<<endl;
	}
}
2021/3/15 18:45
加载中...