求助,为什么会RE啊
查看原帖
求助,为什么会RE啊
540615
dongyc0301楼主2022/7/17 21:43
using namespace std;
struct que
{
	int l,r,num;
}q[500005];
bool cmp1(que x,que y)
{
	return x.l<y.l;
}
bool cmp2(que x,que y)
{
	return x.l<y.r;
}
int gcd(int a,int b)
{
	return b?gcd(b,a%b):a;
}
int main()
{
	int n,m,i,j,k,c[500005 ],t,l[500005 ],r[500005 ]
	,sum[500005],front[500005],second[500005 ],ans;
	bool v[500005];
	cin>>n>>m;
	for(i=1;i<=n;i++)
		cin>>c[i];
	for(i=1;i<=m;i++)
	{
		cin>>q[i].l>>q[i].r,q[i].num=i;
	}
		
	sort(q+1,q+m+1,cmp1);
	t=sqrt(m);
	for(i=1;i<=t;i++)
	{
		l[i]=(i-1)*sqrt(m)+1;
		r[i]=i*sqrt(m);
	}
	if(r[t]<m)
	{
		t++;l[t]=r[t-1]+1;r[t]=m;
	}
	for(i=1;i<=t;i++)
		sort(q+l[i],q+r[i]+1,cmp2);
	for(i=1;i<=t;i++)
	{
		memset(sum,0,sizeof(sum));
		memset(v,0,sizeof(v));ans=0;
		
		int l0=q[l[i]].l,r0=q[l[i]].r;
		for(j=l0;j<=r0;j++)
			sum[c[j]]++;
		for(j=l0;j<=r0;j++)
		{
			if(v[c[j]]) continue;
			v[c[j]]=1;
			ans+=sum[c[j]]*(sum[c[j]]-1)/2;
		}
		int mol=(r0-l0+1)*(r0-l0)/2,g=gcd(mol,ans);
		if(l0==r0||g==0)
		front[q[l[i]].num]=0,second[q[l[i]].num]=1;
		else
		front[q[l[i]].num]=ans/g,second[q[l[i]].num]=mol/g;
		//cout<<l0<<' '<<r0<<" "<<ans/g<<" "<<mol/g<<endl;
		for(j=l[i]+1;j<=r[i];j++)
		{
			memset(v,0,sizeof(v));ans=0;
			l0=q[j].l,r0=q[j].r;
			for(k=q[j-1].l;k<l0;k++)
				sum[c[k]]--;
			for(k=l0;k<q[j-1].l;k++)
				sum[c[k]]++;
			for(k=q[j-1].r+1;k<=r0;k++)
				sum[c[k]]++;
			for(k=r0+1;k<=q[j-1].r;k++)
				sum[c[k]]--;
			for(k=l0;k<=r0;k++)
			{
				if(v[c[k]]) continue;
				v[c[k]]=1;
				ans+=sum[c[k]]*(sum[c[k]]-1)/2;
			}
			mol=(r0-l0+1)*(r0-l0)/2;g=gcd(mol,ans);
			if(l0==r0||g==0)
			front[q[j].num]=0,second[q[j].num]=1;
			else
			front[q[j].num]=ans/g,second[q[j].num]=mol/g;
			//cout<<l0<<' '<<r0<<" "<<ans/g<<" "<<mol/g<<endl;
		}
	}
	for(i=1;i<=m;i++)
		cout<<front[i]<<"/"<<second[i]<<endl;
	return 0;
}
2022/7/17 21:43
加载中...