萌新求助,莫队初学者,模板题WA
查看原帖
萌新求助,莫队初学者,模板题WA
6322
woshiren楼主2020/11/25 22:28
#include<cstdio>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
struct DATA
{
	int l,r,id;
}Q[50005];
int belong[50005],cnt[50005],num1,num2,ans1[50005],ans2[50005],a[50005],n,m;
int gcd(int a,int b)
{
	return b==0?a:gcd(b,a%b);
}
bool cmp(DATA a,DATA b)
{
	if (belong[a.l]!=belong[b.l]) return belong[a.l]<belong[b.l];
	else return a.r<b.r;
}
void update(int l,int r,int al,int ar)
{
	while (l<al) 
	{
		if (cnt[a[l]]>=2) num1-=cnt[a[l]]*(cnt[a[l]]-1);
		cnt[a[l]]--;
		if (cnt[a[l]]>=2) num1+=cnt[a[l]]*(cnt[a[l]]-1);
		l++;
	}
	while (l>al)
	{
		l--;
		if (cnt[a[l]]>=2) num1-=cnt[a[l]]*(cnt[a[l]]-1);
		cnt[a[l]]++;
		if (cnt[a[l]]>=2) num1+=cnt[a[l]]*(cnt[a[l]]-1);
	}
	while (r<ar)
	{
		r++;
		if (cnt[a[r]]>=2) num1-=cnt[a[r]]*(cnt[a[r]]-1);
		cnt[a[r]]++;
		if (cnt[a[r]]>=2) num1+=cnt[a[r]]*(cnt[a[r]]-1);
	}
	while (r>ar)
	{
		if (cnt[a[r]]>=2) num1-=cnt[a[r]]*(cnt[a[r]]-1);
		cnt[a[r]]--;
		if (cnt[a[r]]>=2) num1+=cnt[a[r]]*(cnt[a[r]]-1);
		r--;
	}
}
signed main()
{
	freopen("P1494_1.in","r",stdin);
	freopen("myans.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	int size=0,num=1,lim=sqrt(n) ;
	for (int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
		belong[i]=num;
		size++;
		if (size==lim)
		{
			size=0;
			num++;
		}
	}
	for (int i=1;i<=m;i++)
	{
		scanf("%lld%lld",&Q[i].l,&Q[i].r);
		Q[i].id=i;
	}
	sort(Q+1,Q+1+m,cmp);
	int pt=1;
	for (int i=1;i<=m;i++)
		if (Q[i].l==Q[i].r) ans1[Q[i].id]=0,ans2[Q[i].id]=1,pt++;
	for (int i=Q[pt].l;i<=Q[pt].r;i++)
		cnt[a[i]]++;
	for (int i=1;i<=n;i++)
	{
		if (cnt[i]>=2)
		{
			ans1[Q[pt].id]+=cnt[i]*(cnt[i]-1);
			num1=ans1[Q[pt].id];
			ans2[Q[pt].id]=(Q[pt].r-Q[pt].l+1)*(Q[pt].r-Q[pt].l);
		}
	}
	int last=pt;
	for (int i=pt+1;i<=m;i++)
	{
		if (Q[i].l==Q[i].r) 
		{
			ans1[Q[i].id]=0,ans2[Q[i].id]=1;
			continue;
		}
		update(Q[last].l,Q[last].r,Q[i].l,Q[i].r);
		ans1[Q[i].id]=num1;
		ans2[Q[i].id]=(Q[i].r-Q[i].l+1)*(Q[i].r-Q[i].l);
		if (num1==0 && ans2[Q[i].id]%58311==0) printf("fuckyou\n");
		last=i;
	}
	for (int i=1;i<=m;i++)
	{
		if (ans1[i]==0)
		{
			printf("0/1\n");
			continue;
		}
		int GCD=gcd(ans1[i],ans2[i]);
		printf("%lld/%lld\n",ans1[i]/GCD,ans2[i]/GCD);
	}
	return 0;
}

调了老半天了,还是没发现哪里错了

2020/11/25 22:28
加载中...