为什么不参与计算答案的变量也要开long long?解答必关
查看原帖
为什么不参与计算答案的变量也要开long long?解答必关
752711
hateful_bug楼主2024/12/9 19:39

rt,代码已AC,但必须把代码里的int换成long long(参与答案运算的变量我开了long long,int的是后来宏定义上的,不这么做过不了,想知道为什么qwq)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e4+10;
int n,m,t,c[N];
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(x.l/t!=y.l/t)
	return x.l<y.l;
	if((x.l/t)&1)
	return x.r<y.r;
	return x.r>y.r;
}
long long gcd(long long a,long long b)
{
	if(!b)
	return a;
	return gcd(b,a%b);
}
void xg(int x,int k)
{
	ans-=num[c[x]]*(num[c[x]]-1)/2;
	num[c[x]]+=k;
	ans+=num[c[x]]*(num[c[x]]-1)/2;
}
void solve()
{
	int L=1,R=0;
	for(int i=1;i<=m;i++)
	{
		while(L<q[i].l) xg(L++,-1);
		while(L>q[i].l) xg(--L,1);
		while(R<q[i].r) xg(++R,1);
		while(R>q[i].r) xg(R--,-1);
		if(q[i].l==q[i].r)
		hd[q[i].id]={0,1};
		else
		{
			long long zfa=(q[i].r-q[i].l+1)*(q[i].r-q[i].l)/2,gy=gcd(ans,zfa);
			hd[q[i].id]={ans/gy,zfa/gy};
		}
	}
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
	scanf("%lld",&c[i]);
	for(int i=1;i<=m;i++)
	scanf("%lld%lld",&q[i].l,&q[i].r),q[i].id=i;
	t=sqrt(n);
	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/9 19:39
加载中...