萌新刚学莫队2ms求助
查看原帖
萌新刚学莫队2ms求助
214172
wpy233楼主2023/1/16 16:01

7,8,9 交了几发都T了,求教大佬/dk

#include <bits/stdc++.h>
using namespace std;
#define ll long long
inline ll read()
{
	char ch;
	ll x=0,f=1;
	for(;!isdigit(ch);ch=getchar())
		if(ch=='-')
			f=-1;
	for(; isdigit(ch);ch=getchar())
		x*=10,x+=(ch-'0');
	return x*f;	
}
int n,sq;
int a[50005];
int Q;
struct QAQ{
	ll l;
	ll r;
	int id;
}q[50005];
QAQ qq[50005];
bool comp(QAQ x,QAQ y)
{
	int xl=x.l/sq,yl=x.l/sq;
	if(xl!=yl) return xl<yl;
	return x.r<y.r;
}
ll cnt[50005],cur,l=1,r;
ll ans[50005];
inline void add(int p)
{
	cnt[a[p]]++;
	cur+=2*(cnt[a[p]]-1);
}
inline void del(int p)
{
	cur-=2*(cnt[a[p]]-1);
	cnt[a[p]]--;
}
inline ll gcd(ll x,ll y)
{
	return !y?x:gcd(y,x%y);
}
int main()
{
	n=read();
	Q=read();
	sq=sqrt(n);
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<=Q;i++)
	{
		q[i].l=read();
		q[i].r=read();
		q[i].id=i;
		qq[i].l=q[i].l;
		qq[i].r=q[i].r;
		qq[i].id=i;
	}
	sort(q+1,q+Q+1,comp);
	for(int i=1;i<=Q;i++)
	{
		while(l>q[i].l) add(--l);
		while(r<q[i].r) add(++r);
		while(l<q[i].l) del(l++);
		while(r>q[i].r) del(r--);
		ans[q[i].id]=cur;
	}
	for(int i=1;i<=Q;i++)
	{
		if(qq[i].r==qq[i].l||ans[i]==0)
		{
			printf("0/1\n");
			continue;
		}
		ll t=qq[i].r-qq[i].l+1;
		t=t*(t-1);
		ll p=gcd(ans[i],t);
		printf("%lld/%lld\n",ans[i]/p,t/p);
	}
	return 0;
}
2023/1/16 16:01
加载中...