萌新刚学莫队求助
查看原帖
萌新刚学莫队求助
200044
JS_TZ_ZHR楼主2020/8/5 18:19

RT,样例完全没问题,但就是WA了

#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000005],cnt[1000005],block,num[1000005],ans[1000005],l=1,r,sum;
struct node {
	int l,r,p;
} q[1000005];
bool cmp(node a,node b) {
	if(num[a.l]!=num[b.l])return num[a.l]<num[b.l];
	return a.r<b.r;
}
int main() {
	scanf("%d",&n);
	for(int i=1; i<=n; i++)scanf("%d",&a[i]);
	block=sqrt(n);
	for(int i=1; i<=n; i++)num[i]=(i/block)+(i%block!=0);
	scanf("%d",&m);
	for(int i=1; i<=m; i++) {
		scanf("%d%d",&q[i].l,&q[i].r);
		q[i].p=i;
	}
	sort(q+1,q+m+1,cmp);
	for(int i=1; i<=m; i++) {
		int nl=q[i].l,nr=q[i].r;
		while(l<nl) {
			if(cnt[a[l]]==1)sum--;
			cnt[a[l]]--;
			l++;
		}
		while(r<nr) {
			r++;
			if(!cnt[a[r]])sum++;
			cnt[a[r]]++;
		}
		while(l>nl) {
			l--;
			if(!cnt[a[l]])sum--;
			cnt[a[l]]++;
		}
		while(r>nr) {
			if(cnt[a[r]]==1)sum--;
			cnt[a[r]]--;
			r--;
		}
		ans[q[i].p]=sum;
		/*printf("%d %d %d\n",nl,nr,sum);
		for(int i=1; i<=5; i++)printf("%d ",cnt[i]);
		puts("");*/
	}
	for(int i=1; i<=m; i++)printf("%d\n",ans[i]);
}
2020/8/5 18:19
加载中...