萌新不会莫队模板 求调
查看原帖
萌新不会莫队模板 求调
263414
Sktic楼主2022/9/5 21:31

写法可能有点不同于题解(

感觉cnt写挂了,但是我没有证据

#include<bits/stdc++.h>
using namespace std;
const int maxn=5e4+10;
typedef long long ll;
inline int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')
			f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=((x<<3)+(x<<1))+(c-'0'); 
		c=getchar();
	}
	return x*f;
}
int len;
int a[maxn],ans[maxn],all[maxn];
int num[maxn]; 
struct ask
{
	int l,r,k;
	bool operator<(const ask &x)const
	{
		if(l/len!=x.l/len)
			return l<x.l;
		if((l/len)%2==0)
			return r<x.r;
		return r>x.r;
	}
};
ask q[maxn];
int ql=q[1].l,qr=q[1].l,cnt=0;
inline void add(int x)
{
	num[a[x]]++;
	if(num[a[x]]>=2)
		cnt+=num[a[x]]-1;
	return;
}
inline void del(int x)
{
	num[a[x]]--;
	if(num[a[x]]>=1)
		cnt-=num[a[x]];
	return;
}
int main()
{
	int n=read(),m=read();
	len=sqrt(n);
	for(int i=1;i<=n;i++)
		a[i]=read();
	for(int i=1;i<=m;i++)
		q[i].l=read(),q[i].r=read(),q[i].k=i;
	sort(q+1,q+m+1);
	num[a[q[1].l]]++;
	for(int i=1;i<=m;i++)
	{
		while(ql<q[i].l)
			del(ql++);
		while(qr<q[i].r)
			add(++qr);
		while(q[i].l<ql)
			add(--ql);
		while(q[i].r<qr)
			del(qr--);
		if(cnt==0)
			ans[q[i].k]=0,all[q[i].k]=1;
		else
		{
			int g=__gcd(cnt,(q[i].r-q[i].l+1)*(q[i].r-q[i].l)/2);
			ans[q[i].k]=cnt/g,all[q[i].k]=(q[i].r-q[i].l+1)*(q[i].r-q[i].l)/2/g;
		}
	}
	for(int i=1;i<=m;i++)
		printf("%d/%d\n",ans[i],all[i]);
	return 0;
}
2022/9/5 21:31
加载中...