MnZn刚学求助10pts
查看原帖
MnZn刚学求助10pts
428889
Xile楼主2023/11/24 22:07
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=5e4+5;
int n,m,num[N];

//int Add(int x,int y) {return x+y>=mod?x+y-mod:x+y;}
//int Sub(int x,int y) {return x-y<0?x-y+mod:x-y;}
//int Mul(int x,int y) {return 1ll*x*y%mod;}
int read(){
	int x=0,f=0;char c=getchar();
	while(!isdigit(c)) f|=(c=='-'),c=getchar();
	while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return f?-x:x;
}
void write(int x){
	if(x/10) write(x/10);
	putchar(x%10^48);
}
void print(int x){
	if(x<0) putchar('-'),x=-x;
	write(x),putchar('\n');
}

int gcd(int x,int y){
	return y?gcd(y,x%y):x;
}

int pos[N],cnt[N],ans1[N],ans2[N],res1;
struct Q{
	int l,r,id;
	bool operator <(const Q &b)const{
		return pos[l]==pos[b.l]?r<b.r:pos[l]<pos[b.l];
	}
}a[N];

int C(int x,int y){
	int ans=y*y-y;
	return ans/2;
}
void add(int pos){
	cnt[num[pos]]++;
	res1+=cnt[num[pos]]*(cnt[num[pos]]-1)/2-(cnt[num[pos]]-1)*(cnt[num[pos]]-2)/2; 
}
void sub(int pos){
	cnt[num[pos]]--;
	res1+=cnt[num[pos]]*(cnt[num[pos]]-1)/2-(cnt[num[pos]]+1)*(cnt[num[pos]])/2;
}

signed main(){
	n=read(),m=read();
	int siz=sqrt(n);
	for(int i=1;i<=n;i++) num[i]=read(),pos[i]=(i-1)/siz+1;
	for(int i=1;i<=m;i++) a[i].l=read(),a[i].r=read(),a[i].id=i;
	sort(a+1,a+1+m);
	int l=1,r=0;
	for(int i=1;i<=m;i++){
		if(a[i].l==a[i].r) continue;
		while(a[i].l<l) add(--l);
		while(a[i].r>r) add(++r);
		while(a[i].l>l) sub(l++);
		while(a[i].r<r) sub(r--);
		ans1[a[i].id]=res1;
		ans2[a[i].id]=(a[i].r-a[i].l+1)*(a[i].r-a[i].l)/2;
	}
	for(int i=1;i<=m;i++){
		if(a[i].l==a[i].r||!ans1[i]) puts("0/1");
		else{
			int k=gcd(ans1[i],ans2[i]);
			write(ans1[i]/k),putchar('/'),print(ans2[i]/k);
		}
	}
	return 0;
}
2023/11/24 22:07
加载中...