萌新妹子,刚学莫队,改了半天只能AC#4 ,有没有路过大佬帮调qaq?
查看原帖
萌新妹子,刚学莫队,改了半天只能AC#4 ,有没有路过大佬帮调qaq?
538821
m1kusama楼主2023/8/8 14:30
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e4+10;
int n,m;
int a[N];
struct q{
	int l, r, m;
	int all,ans;
}qu[N];
int len,num,be[N],L[N],R[N];
inline int gcd(int x,int y){return !y?x:gcd(y,x%y);}
void init(){
	len=sqrt(n);
	num=(n+len-1)/len;
	for(int i=1;i<=num;i++){
		L[i]=R[i-1]+1;
		R[i]=i*len;
	}
	for(int i=1;i<=num;i++){
		for(int j=L[i];j<=R[i];j++){
			be[j]=i;
		}
	}
}
bool cmp(q a,q b){
	return be[a.l]==be[b.l] ? a.r<b.r : be[a.l]<be[b.l];
}
bool cmp1(q a,q b){
	return a.m<b.m;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		cin>>qu[i].l>>qu[i].r;
		qu[i].m=i;
	}
	init();
	sort(qu+1,qu+m+1,cmp);
	int l=1,r=1;
	int t[N];
	memset(t,0,sizeof(t));
	int nowans=0;
	for(int i=1;i<=m;i++){
		qu[i].all=(qu[i].r-qu[i].l)*(qu[i].r-qu[i].l+1)/2;
		while(l<qu[i].l){
			if(t[a[l]]>=2)
				nowans-=t[a[l]]*(t[a[l]]-1)/2-(t[a[l]]-1)*(t[a[l]]-2)/2;
			t[a[l]]--;
			l++;
		}
		while(l>qu[i].l){
			if(t[a[l-1]]>=1)
				nowans+=t[a[l-1]]*(t[a[l-1]]+1)/2-(t[a[l-1]]-1)*(t[a[l-1]])/2;
			l--;
			t[a[l]]++;
		
		}
		while(r<qu[i].r){
			if(t[a[r+1]]>=1)
				nowans+=t[a[r+1]]*(t[a[r+1]]+1)/2-(t[a[r+1]]-1)*(t[a[r+1]])/2;
			r++;
			t[a[r]]++;
		}
		while(r>qu[i].r){
			if(t[a[r]]>=2)
				nowans-=t[a[r]]*(t[a[r]]-1)/2-(t[a[r]]-1)*(t[a[r]]-2)/2;
			t[a[r]]--;
			r--;
		}
		qu[i].ans=nowans;
	}
	sort(qu+1,qu+m+1,cmp1);
	for(int i=1;i<=m;i++){
		if(qu[i].l==qu[i].r or qu[i].ans==0 or qu[i].all==0) cout<<0<<"/"<<1<<endl;
		else{
			cout<<qu[i].ans/gcd(qu[i].ans,qu[i].all)<<"/"<<qu[i].all/gcd(qu[i].ans,qu[i].all)<<endl;
		}
	}
	return 0;
}
2023/8/8 14:30
加载中...