开了LL,特判了L==R,只A了#10其他都是WA求调TwT
查看原帖
开了LL,特判了L==R,只A了#10其他都是WA求调TwT
177000
vicky2048_2楼主2025/7/30 21:41

把讨论区前几页能找到的坑都查了,但还是调不出来awa

#include<bits/stdc++.h>
#define N 50004
#define int long long
using namespace std;
int n,m,a[N],bl[N]/*block*/,cnt[N];
struct pnt{
	int l,r,bh,ans;
}q[N];
bool cmp(pnt a,pnt b){
	if(bl[a.l]==bl[b.l])
		return a.r<b.r;
	return bl[a.l]<=bl[b.l];
}
bool cm(pnt a,pnt b){
	return a.bh<b.bh;
}
int gcd(int,int);
void pre();
signed main(){
//	cout<<sizeof(int);
	freopen("1494_1.in","r",stdin);
	freopen("1494_1.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;++i)
		scanf("%lld",&a[i]);
	pre();
	for(int i=1;i<=m;++i){
		scanf("%lld%lld",&q[i].l,&q[i].r);
		q[i].bh=i;
	}
	sort(q+1,q+1+m,cmp);
	int l=q[1].l,r=l;
	for(;r<=q[1].r;++r){
		++cnt[a[r]];
		int x=cnt[a[r]];
		if(x>1)
			q[1].ans+=(x<<1)-2;
		else
			q[1].ans+=x*x-x;
	} --r;
	for(int i=2;i<=m;++i){
		q[i].ans=q[i-1].ans;
		while(l>q[i].l){
			++cnt[a[--l]];
			int x=cnt[a[l]];
			if(x>1)
				q[i].ans+=(x<<1)-2;
			else
				q[i].ans+=x*x-x;
		}
		while(l<q[i].l){
			--cnt[a[l++]];
			int x=cnt[a[l-1]];
			q[i].ans-=(x<<1);
		}
		while(r<q[i].r){
			++cnt[a[++r]];
			int x=cnt[a[r]];
			if(x>1)
				q[i].ans+=(x<<1)-2;
			else
				q[i].ans+=x*x-x;
		}
		while(r>q[i].r){
			--cnt[a[r--]];
			int x=cnt[a[r+1]];
			q[i].ans-=(x<<1);
		}
	}
	sort(q+1,q+1+m,cm);
	for(int i=1,k;k=gcd((q[i].r-q[i].l)*(q[i].r-q[i].l+1),q[i].ans),i<=m;++i){
		if(q[i].ans&&q[i].r!=q[i].l)
			printf("%lld/%lld\n",q[i].ans/k,(q[i].r-q[i].l)*(q[i].r-q[i].l+1)/k);
		else
			printf("0/1\n");
	}
	return 0;
}
void pre(){
	int B=(int)sqrt(m);
	for(int i=1;i<=n;++i){
		bl[i]=i/B;
		if(i%B)
			++bl[i];
	}
}
int gcd(int a,int b){
	return !b?a:gcd(b,a%b);
}
2025/7/30 21:41
加载中...