RT,Code 在这儿:
#include<bits/stdc++.h>
using namespace std;
const int N=50005;
typedef long long ll;
int n,m,res;
int a[N],in[N],cnt[N],ser[N],vid[N];
struct Query{
int l,r,id;
} Q[N];
bool cmp(Query A,Query B){
if(in[A.l]!=in[B.l]) return A.l<B.l;
if(in[A.l]&1) return A.r<B.r;
return A.r>B.r;
}
int C2(int x){
return (ll)x*(x-1)/2;
}
void Add(int x){
res-=C2(cnt[x]);
res+=C2(++cnt[x]);
}
void Del(int x){
res-=C2(cnt[x]);
res+=C2(--cnt[x]);
}
void putfrac(int p,int q){
int g=__gcd(p,q);
printf("%d/%d\n",p/g,q/g);
}
int main(){
scanf("%d%d",&n,&m);
int len=sqrt(n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),in[i]=(i-1)/len+1;
for(int i=1;i<=m;i++) scanf("%d%d",&Q[i].l,&Q[i].r),Q[i].id=i;
sort(Q+1,Q+m+1,cmp);
for(int i=1,l=1,r=0;i<=m;i++){
/*if(Q[i].l==Q[i].r){
ser[Q[i].id]=0,vid[Q[i].id]=1;
continue;
}*/
while(Q[i].l<l) Add(a[--l]);
while(r<Q[i].r) Add(a[++r]);
while(l<Q[i].l) Del(a[l++]);
while(Q[i].r<r) Del(a[r--]);
ser[Q[i].id]=res,vid[Q[i].id]=C2(Q[i].r-Q[i].l+1);
}
for(int i=1;i<=m;i++) putfrac(ser[i],vid[i]);
return 0;
}
注释后惨遭 RE。