Wa求助
查看原帖
Wa求助
217634
anonymous217楼主2023/10/7 19:19

目前看出来的是输出了太多的0/1

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5; 
int ans1[N],ans2[N];
int n,m,c[N],s[N],T,sum;
struct node
{
	int l,r,id;
}opr[N];
bool cmp(node a,node b)
{
	if(a.l/T==b.l/T)return a.r<b.r;
	return a.l<b.l;
}
void Delete(int val)
{
	c[s[val]]--;sum-=2*c[s[val]]+1;
}
void Insert(int val)
{
	sum+=2*c[s[val]]+1;c[s[val]]++;
}
int gcd(int a,int b)
{
    if(b==0)return a;
    return gcd(b,a%b);
}
signed main()
{
	cin>>n>>m;T=sqrt(n);
	for(int i=1;i<=n;i++)cin>>s[i];
	for(int i=1;i<=m;i++)
	{
		cin>>opr[i].l>>opr[i].r;
        if(opr[i].l>opr[i].r)
            swap(opr[i].l,opr[i].r);
		opr[i].id=i;
	}
	sort(opr+1,opr+m+1,cmp);
	int dx=1,dy=0;
	for(int i=1;i<=m;i++)
	{
		int qx=opr[i].l,qy=opr[i].r;
		while(dx>qx){dx--;Insert(dx);}
		while(dy<qy){dy++;Insert(dy);}
		while(dx<qx){Delete(dx);dx++;}
		while(dy>qy){Delete(dy);dy--;}
		ans1[opr[i].id]=sum-(qy-qx+1);
        ans2[opr[i].id]=(qy-qx+1)*(qy-qx);
	}
	for(int i=1;i<=m;i++)
    {
        if(ans1[i]==0||opr[i].l==opr[i].r)cout<<"0/1\n";
        else
        {
            int dev=gcd(ans1[i],ans2[i]);
            cout<<ans1[i]/dev<<"/"<<ans2[i]/dev<<"\n";
        }
    }
    return 0;
}
2023/10/7 19:19
加载中...