莫队板子求调qwq
查看原帖
莫队板子求调qwq
177000
vicky2048_2楼主2025/7/30 22:15
#include<bits/stdc++.h>
#define N 50004
#define int long long
using namespace std;
int n,m,a[N],bl[N]/*block*/,cnt[N];
struct pnt{
	int l,r,bh,ans;
}q[N];
bool cmp(pnt a,pnt b){
	if(bl[a.l]==bl[b.l])
		return a.r<b.r;
	return bl[a.l]<=bl[b.l];
}
bool cmp_bh(pnt a,pnt b){
	return a.bh<b.bh;
}
void add(int,int&),del(int,int&);
int gcd(int,int);
void pre();
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;++i)
		scanf("%lld",&a[i]);
	pre();
	for(int i=1;i<=m;++i){
		scanf("%lld%lld",&q[i].l,&q[i].r);
		q[i].bh=i;
	}
	sort(q+1,q+1+m,cmp);
	int l=q[1].l,r=l;
	for(;r<=q[1].r;++r)
		add(a[r],q[1].ans);	
	--r;
	for(int i=2;i<=m;++i){
		q[i].ans=q[i-1].ans;
		while(l>q[i].l)
			add(a[--l],q[i].ans);
		while(l<q[i].l)
			del(a[l++],q[i].ans);
		while(r<q[i].r)
			add(a[++r],q[i].ans);
		while(r>q[i].r)
			del(a[r--],q[i].ans);
	}
	sort(q+1,q+1+m,cmp_bh);
	for(int i=1;i<=m;++i){
		int p=(q[i].r-q[i].l)*(q[i].r-q[i].l+1),k=gcd(p,q[i].ans);
		if(q[i].ans&&q[i].r!=q[i].l)
			printf("%lld/%lld\n",q[i].ans/k,p/k);
		else
			printf("0/1\n");
	}
	return 0;
}
void add(int k,int &ans){
	++cnt[k];
	if(cnt[k]>1)
		ans+=(cnt[k]<<1)-2;
	else
		ans+=cnt[k]*cnt[k]-cnt[k];
}
void del(int k,int &ans){
	--cnt[k];
	ans-=(cnt[k]<<1);
}
void pre(){
	int B=(int)sqrt(m);
	for(int i=1;i<=n;++i){
		bl[i]=i/B;
		if(i%B)
			++bl[i];
	}
}
int gcd(int a,int b){
	return !b?a:gcd(b,a%b);
}
2025/7/30 22:15
加载中...