萌新刚学OI,莫队40TLE求助
查看原帖
萌新刚学OI,莫队40TLE求助
479851
pujingcat楼主2022/1/23 15:59

rt,一般来说T是排序错了,但我也找不到问题,求大佬救蒟蒻

#include <bits/stdc++.h>
#define N 1000100
using namespace std;
struct shit {
	int w,id;
} pp[N];
struct fuck {
	int l,r;
	int id,pos;
} que[N];
int n,q,nn,fl=0,fr=0,ans=0,cnt=0;
int p[N],ansk[N],sum[N];
bool cmp(fuck a,fuck b) {//pos为l所在的块 
	return (a.pos!=b.pos?a.pos<b.pos:a.r<b.r);
}
bool cnm(shit a,shit b) {
	return a.w<b.w;
}
signed main() {
	scanf("%d",&n);
	nn=sqrt(n);//分块 
	for(int i=1; i<=n; ++i) {
		scanf("%d",&pp[i].w);
		pp[i].id=i;
	}
	sort(pp+1,pp+1+n,cnm);
	pp[0].w=-1;
	for(int i=1; i<=n; ++i) {//离散化 
		if(pp[i].w!=pp[i-1].w) p[pp[i].id]=++cnt;
		else p[pp[i].id]=cnt;
		sum[i]=0;
	}
	scanf("%d",&q);
	for(int i=1; i<=q; ++i) scanf("%d%d",&que[i].l,&que[i].r),que[i].id=i,que[i].pos=(que[i].l+1)/nn+1;
	sort(que+1,que+1+q,cmp);//询问排序 
	for(int i=1; i<=q; i++) {//莫队 
		while(fl>que[i].l)fl--,sum[p[fl]]++,ans+=(sum[p[fl]]==1?1:0);
		while(fr<que[i].r)fr++,sum[p[fr]]++,ans+=(sum[p[fr]]==1?1:0);
		while(fl<que[i].l)sum[p[fl]]--,ans-=(sum[p[fl]]==0?1:0),fl++;
		while(fr>que[i].r)sum[p[fr]]--,ans-=(sum[p[fr]]==0?1:0),fr--;
		ansk[que[i].id]=ans;
	}
	for(int i=1; i<=q; i++) printf("%d\n",ansk[i]);//输出 
	return 0;
}
2022/1/23 15:59
加载中...