RT,新人写的莫队,求大佬找错
代码臭长
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,m,cnt[N],pos[N],block,a[N],l=1,r=0,ans=0;
struct node {
int l,r,id,ans;
}q[N];
bool cmp (node x,node y) {
if (pos[x.l]<pos[y.l]) return 1;
if (pos[x.l]>pos[y.l]) return 0;
return x.r<y.r;
}
bool comp (node x,node y) {
return x.id<y.id;
}
void add (int p) {
ans-=(cnt[a[p]]*(cnt[a[p]]-1)/2);
cnt[a[p]]++;
ans+=(cnt[a[p]]*(cnt[a[p]]-1)/2);
}
void del (int p) {
ans-=(cnt[a[p]]*(cnt[a[p]]-1)/2);
cnt[a[p]]--;
ans+=(cnt[a[p]]*(cnt[a[p]]-1)/2);
}
int gcd (int x,int y) {
if (!x%y) return y;
return gcd(y,x%y);
}
int main () {
scanf("%d%d",&n,&m);
block=(n/sqrt(m*2/3));
for (int i=1;i<=n;i++) {
scanf("%d",&a[i]);
pos[i]=(i-1)/block+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+1+m,cmp);
for (int i=1;i<=m;i++) {
if (q[i].l==q[i].r) {
q[i].ans=0;
continue;
}
while (l<q[i].l) {
del(l);
l++;
}
while (l>q[i].l) {
add(l-1);
l--;
}
while (r<q[i].r) {
add(r+1);
r++;
}
while (r>q[i].r) {
del(r);
r--;
}
q[i].ans=ans;
}
sort(q+1,q+1+m,comp);
for (int i=1;i<=m;i++) {
if (q[i].l==q[i].r) {
puts("0/1");
}else{
int GCD=gcd(q[i].ans,(q[i].r-q[i].l+1)*(q[i].r-q[i].l)/2);
printf("%d/%d",q[i].ans/GCD,(q[i].r-q[i].l+1)*(q[i].r-q[i].l)/2/GCD);
puts("");
}
}
return 0;
}