RE*3+TLE*7
查看原帖
RE*3+TLE*7
450743
XOOR楼主2023/9/30 14:16

样例全过

#include<cstdio>
#include<cmath>
#include<algorithm>
#define int long long
using namespace std;
const int N=5e4+10;
int n,m,bl,cl,cr,ans;
int a[N],vis[N],as[N],fm[N];	
struct Node{
	int l,r,p;
	bool friend operator < (Node a,Node b){
		if((a.l/bl)==(b.l/bl)){
			if(a.l/bl&1) return a.l<b.l;
			else return a.l>b.l;
		}else return a.l/bl<b.l/bl;
	}
}e[N];
void add(int p){
	vis[a[p]]++;
	if(vis[a[p]]>1)
		ans=ans-(vis[a[p]]-1)*(vis[a[p]]-2)+vis[a[p]]*(vis[a[p]]-1);
}
void cut(int p){
	vis[a[p]]--;
	if(vis[a[p]]>0)
		ans=ans-(vis[a[p]]+1)*vis[a[p]]+(vis[a[p]]-1)*vis[a[p]];
}
signed main(){
	scanf("%lld%lld",&n,&m);
	bl=sqrt(n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	for(int i=1;i<=m;i++){
		scanf("%lld%lld",&e[i].l,&e[i].r);
		e[i].p=i;
	}
	sort(e+1,e+m+1);
	for(int i=1;i<=m;i++){
		int L=e[i].l,R=e[i].r;
		while(cr<R) add(++cr);
		while(cr>R) cut(cr--);
		while(cl<L) cut(cl++);
		while(cl>L) add(--cl);
		as[e[i].p]=ans;
		fm[e[i].p]=(R-L)*(R-L+1);
		int gcc=__gcd(as[e[i].p],fm[e[i].p]);
		as[e[i].p]/=gcc;
		fm[e[i].p]/=gcc;
	}
	for(int i=1;i<=m;i++) printf("%lld/%lld\n",as[i],fm[i]);
	return 0;
}
2023/9/30 14:16
加载中...