60分wa后面4个点求助大佬
查看原帖
60分wa后面4个点求助大佬
148092
Dark_lightrq楼主2023/7/5 11:32
#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL gcd(LL a,LL b){
	return b?gcd(b,a%b):a;
}
int n,m;
int c[50005];
int belong[50005];
struct node{
	int l,r,id;
}q[50005];
int ans[50005][2];
bool cmp(node a,node b){
	return belong[a.l]^belong[b.l]?a.l<b.l:a.r<b.r;
}
LL num;
int cnt[50005];
inline void add(int k){
	int x=c[k];
	num-=(LL)cnt[x]*(cnt[x]-1)/2;
	cnt[x]++;
	num+=(LL)cnt[x]*(cnt[x]-1)/2;
}
inline void del(int k){
	int x=c[k];
	num-=(LL)cnt[x]*(cnt[x]-1)/2;
	cnt[x]--;
	num+=(LL)cnt[x]*(cnt[x]-1)/2;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&c[i]);
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&q[i].l,&q[i].r);
		q[i].id=i;
	}
	int size=sqrt(n);
	int bnum=ceil((double)n/size);
	for(int i=1;i<=bnum;i++){
		int l=size*(i-1)+1;
		int r=size*i;
		for(int j=l;j<=r;j++){
			belong[j]=i;
		}
	}
	sort(q+1,q+1+m,cmp);
	int l=1,r=0;
	for(int i=1;i<=m;i++){
		/*if(q[i].l==q[i].r){
			ans[q[i].id][0]=0,ans[q[i].id][1]=1;
			continue;
		}*/
		while(l<q[i].l)del(l++);
		while(l>q[i].l)add(--l);
		while(r<q[i].r)add(++r);
		while(r>q[i].r)del(r--);
		LL s=num,g=(LL)(r-l+1)*(r-l)/2;
		LL k=gcd(s,g);
		if(s==0){
			ans[q[i].id][0]=0,ans[q[i].id][1]=1;
		}
		else ans[q[i].id][0]=s/k,ans[q[i].id][1]=g/k;
	}
	for(int i=1;i<=m;i++){
		printf("%d/%d\n",ans[i][0],ans[i][1]);
	}
	return 0;
}
2023/7/5 11:32
加载中...