过样例但0pts,悬关求调
查看原帖
过样例但0pts,悬关求调
752711
hateful_bug楼主2024/12/4 22:04
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+10;
int n,m,t,c[N],b[505];
long long ans,num[N];
pair<long long,long long> hd[N];
struct jgt
{
	int l,r,id;
}q[N];
bool cmp(jgt x,jgt y)
{
	if(b[x.l]==b[y.l])
	return x.r<y.r;
	return x.l<y.l;
}
long long gcd(long long a,long long b)
{
	if(b==0)
	return a;
	return gcd(b,a%b);
}
void xg(int color,int k)
{
	ans-=num[color]*(num[color]-1)/2;
	num[color]+=k;
	ans+=num[color]*(num[color]-1)/2;
}
void solve()
{
	for(int i=1,l=1,r=0;i<=m;i++)
	{
		jgt j=q[i];
		while(l<j.l) xg(c[l++],-1);
		while(l>j.l) xg(c[--l],1);
		while(r<j.r) xg(c[++r],1);
		while(r>j.r) xg(c[r--],-1);
		if(j.l==j.r)
		hd[j.id]={0,1};
		else
		{
			long long zfa=(j.r-j.l+1)*(j.r-j.l)/2,gy=gcd(ans,zfa);
			hd[j.id]={ans/gy,zfa/gy};
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	scanf("%d",&c[i]);
	for(int i=1;i<=m;i++)
	scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
	t=sqrt(n);
	for(int i=1;i<=n;i++)
	b[i]=(i-1)/t+1;
	sort(q+1,q+m+1,cmp);
	solve();
	for(int i=1;i<=m;i++)
	printf("%lld/%lld\n",hd[i].first,hd[i].second);
	return 0;
}
2024/12/4 22:04
加载中...