第一个题解!
2025-08-25 11:36:15
发布于:北京
8阅读
0回复
0点赞
#include<bits/stdc++.h>
#define fi first
#define se second
#define pa pair<int,int>
#define int long long
using namespace std;
const int N=1e5+5;
int a[N],c[N],sm,ans[N],ans2[N];
int clac(int x){
return x*(x-1)/2;
}
void add(int x){
c[a[x]]++;
int t=c[a[x]];
sm=sm-clac(t-1)+clac(t);
}
void del(int x){
c[a[x]]--;
int t=c[a[x]];
sm=sm-clac(t+1)+clac(t);
}
int gcd(int a,int b){
if (b==0) return a;
if (a<b) return gcd(b,a);
return gcd(b,a%b);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n,m;
cin >> n >> m;
int L=sqrt(n);
for (int i=1;i<=n;++i) cin >> a[i];
vector<pair<int,pa>> que;
int l,r,lp,rp;
for (int i=1;i<=m;++i){
cin >> l >> r;
pa t;t.fi=l,t.se=r;
que.emplace_back(i,t);
ans2[i]=clac(r-l+1);
}
sort(que.begin(),que.end(),[&L](const pair<int,pa> &a1,const pair<int,pa> &b1){
pa a=a1.se,b=b1.se;
if (a.fi/L==b.fi/L) return a.se<b.se;
return a.fi<b.fi;
});
l=r=1,add(1);
for (auto &q:que){
lp=q.se.fi,rp=q.se.se;
for (int i=l-1;i>=lp;--i) add(i);
for (int i=l;i<lp;++i) del(i);
for (int i=r;i>rp;--i) del(i);
for (int i=r+1;i<=rp;++i) add(i);
ans[q.fi]=sm;
l=lp,r=rp;
}
for (int i=1;i<=m;++i){
int t=gcd(ans[i],ans2[i]);
if (ans[i]==0) t=1,ans2[i]=1;
cout<<ans[i]/t<<"/"<<ans2[i]/t<<"\n";
}
cout.flush();
return 0;
}
这里空空如也
有帮助,赞一个