Ac on 10,10pts求条
查看原帖
Ac on 10,10pts求条
755270
jzc114514楼主2025/2/7 10:03
#include<bits/stdc++.h>
#define lp (p*2)
#define rp (p*2+1)//rp++!
#define G t[p].lz
#define ll long long
#define csp c[s[p]]
using namespace std;
const ll N=5e5+50; 
struct query{
	ll l,r,id;
}Q[N];
struct answer{
	ll deno,nume;//分母,分子 
}ans[N];
ll n,m,sum,len;
ll s[N],c[N],in[N];
bool cmpQ(query x,query y){
	if(in[x.l]==in[y.l])return x.r<y.r;
	return (x.l)<(y.l);
}
//bool cmp(answer x,answer y){
//	return x.id<y.id;
//}
void add(ll p){
	sum+=2*(csp);
	csp++;
}
void remove(ll p){
	if(csp>=2)sum-=2*(csp-1);
	csp--;
}
ll gcd(ll a,ll b){
//	cout<<"gcd\n";
	if(a==0)return b;
	return gcd(b%a,a);
}
signed main(){
	freopen("P1494_1.in","r",stdin);
//	freopen(".out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	len=n/sqrt(n);
	for(ll i=1;i<=n;i++)cin>>s[i],in[i]=(i-1)/len+1;
	for(ll i=1;i<=m;i++)cin>>Q[i].l>>Q[i].r,Q[i].id=i;
	sort(Q+1,Q+m+1,cmpQ);
	ll L=1,R=0;
	for(ll i=1;i<=m;i++){
		if(Q[i].l==Q[i].r){
			ans[i].deno=1,ans[i].nume=0;
			continue;
		}
		while(L>Q[i].l)add(--L);
		while(R<Q[i].r)add(++R);
		while(L<Q[i].l)remove(L++);
		while(R>Q[i].r)remove(R--);
		
		ans[Q[i].id].deno=(R-L+1)*(R-L);
		ans[Q[i].id].nume=sum;
	}
	for(ll i=1;i<=m;i++){
//		cout<<ans[i].nume<<" "<<ans[i].deno<<"\n";
		if(ans[i].nume){
			ll g=__gcd(ans[i].nume,ans[i].deno);
			ans[i].nume/=g;
			ans[i].deno/=g;
		}
		else ans[i].deno=1;
		cout<<ans[i].nume<<"/"<<ans[i].deno<<"\n";
	}
}
2025/2/7 10:03
加载中...