第一次打莫队,最后一个点T了,求大佬帮忙指导卡常
查看原帖
第一次打莫队,最后一个点T了,求大佬帮忙指导卡常
755096
2023wangzhaolan楼主2023/11/10 22:27
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+10;
int gcd(int a,int b){
	if(a==0||b==0)return max(a,b);
	return gcd(min(a,b),max(a,b)%min(a,b));
}
int a[N],n,m;
struct node{
	int l,r,lk,id,ans;
}q[N];
int ans,tong[N];
void myin(const int &x){
	ans+=tong[a[x]];tong[a[x]]++;
}
void myout(const int &x){
	tong[a[x]]--;ans-=tong[a[x]];
}
bool cmp(const node &a,const node &b){
	return (a.lk==b.lk)?(a.r<=b.r):(a.lk<=b.lk);
}
bool cmp2(const node &a,const node &b){
	return a.id<=b.id;
}
int head=1,tail=0;
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	for(int i=1;i<=m;i++){
		scanf("%lld%lld",&q[i].l,&q[i].r);q[i].lk=q[i].l/(sqrt(n));q[i].id=i;
	}
	sort(q+1,q+m+1,cmp);
	for(int i=1;i<=m;i++){
		while(tail<q[i].r)myin(++tail);
		while(head>q[i].l)myin(--head);
		while(tail>q[i].r)myout(tail--);
		while(head<q[i].l)myout(head++);
		q[i].ans=ans;
	}
	sort(q+1,q+m+1,cmp2);
	for(int i=1;i<=m;i++){
		int num1=q[i].r-q[i].l+1,num2=num1*(num1-1)/2,num3=gcd(q[i].ans,num2);
		if(q[i].l==q[i].r)printf("0/1\n");
		else printf("%lld/%lld\n",q[i].ans/num3,num2/num3);
	}
	return 0;
}
2023/11/10 22:27
加载中...