求助!莫名RE
查看原帖
求助!莫名RE
371278
herselfqwq楼主2021/6/24 10:04

RT,新人写的莫队,求大佬找错

代码臭长

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,m,cnt[N],pos[N],block,a[N],l=1,r=0,ans=0;
struct node {
	int l,r,id,ans;
}q[N];
bool cmp (node x,node y) {
	if (pos[x.l]<pos[y.l]) return 1;
	if (pos[x.l]>pos[y.l]) return 0;
	return x.r<y.r;
}
bool comp (node x,node y) {
	return x.id<y.id;
}
void add (int p) {
	ans-=(cnt[a[p]]*(cnt[a[p]]-1)/2);
	cnt[a[p]]++;
	ans+=(cnt[a[p]]*(cnt[a[p]]-1)/2);
}
void del (int p) {
	ans-=(cnt[a[p]]*(cnt[a[p]]-1)/2);
	cnt[a[p]]--;
	ans+=(cnt[a[p]]*(cnt[a[p]]-1)/2);
}
int gcd (int x,int y) {
	if (!x%y) return y;
	return gcd(y,x%y);
}
int main () {
	scanf("%d%d",&n,&m);
	block=(n/sqrt(m*2/3));
	for (int i=1;i<=n;i++) {
		scanf("%d",&a[i]);
		pos[i]=(i-1)/block+1;
	}
	for (int i=1;i<=m;i++) {
		scanf("%d%d",&q[i].l,&q[i].r);
		q[i].id=i;
	}
	sort(q+1,q+1+m,cmp);
	for (int i=1;i<=m;i++) {
		if (q[i].l==q[i].r) {
			q[i].ans=0;
			continue;
		}
		while (l<q[i].l) {
			del(l);
			l++;
		}
		while (l>q[i].l) {
			add(l-1);
			l--;
		}
		while (r<q[i].r) {
			add(r+1);
			r++;
		}
		while (r>q[i].r) {
			del(r);
			r--;
		}
		q[i].ans=ans;
	}
	sort(q+1,q+1+m,comp);
	for (int i=1;i<=m;i++) {
		if (q[i].l==q[i].r) {
			puts("0/1");
		}else{
			int GCD=gcd(q[i].ans,(q[i].r-q[i].l+1)*(q[i].r-q[i].l)/2);
			printf("%d/%d",q[i].ans/GCD,(q[i].r-q[i].l+1)*(q[i].r-q[i].l)/2/GCD);
			puts("");
		}
	}
	return 0;
}
2021/6/24 10:04
加载中...