蒟蒻求助莫队
查看原帖
蒟蒻求助莫队
383791
Others楼主2021/7/15 21:14

86pts,TLE,怎么卡都卡不过#9,#10

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1000005;
inline void write(register int ans,register bool bk){if(ans<0)putchar('-'),ans=-ans;if(ans==0){if(!bk)putchar('0');return ;}write(ans/10,true);putchar(ans%10^'0');}
inline void qr(register int &ret){register int x=0,f=0;register char ch=getchar();while(ch<'0'||ch>'9')f|=ch=='-',ch=getchar();while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();ret=f?-x:x;}
struct node{
	int l,r,id,cl;
}p[MAXN];
inline bool cmp(register node x,register node y){
	return x.cl==y.cl?(x.cl&1?x.r<y.r:x.r>y.r):x.l<y.l;
}
int a[MAXN],cnt[MAXN],ans[MAXN];
int main() {
    register int n,m,s,tot;
	qr(n);
	s=floor(sqrt(n));
	for(register int i=1;i<=n;++i){
		qr(a[i]);
	}
	qr(m);
	for(register int i=1;i<=m;++i){
		qr(p[i].l),qr(p[i].r);
		p[i].cl=(p[i].l+s-1)/s;
		p[i].id=i;
	}
	sort(p+1,p+m+1,cmp);
	register int l=0,r=0;
	for(register int i=1;i<=m;++i){
		while(l>p[i].l) tot+=++cnt[a[--l]]==1;
		while(r<p[i].r) tot+=++cnt[a[++r]]==1;
		while(l<p[i].l) tot-=--cnt[a[l++]]==0;
		while(r>p[i].r) tot-=--cnt[a[r--]]==0;
//		cout << tot << " " << p[i].id << endl;
		ans[p[i].id]=tot;
	}
	for(register int i=1;i<=m;++i){
		write(ans[i],false);
		putchar('\n');
	}
	return 0;
}
2021/7/15 21:14
加载中...