#include<bits/stdc++.h>
using namespace std;
long long a[50005], cnt[50005], ans[50005], sum = 0, ans1[50005];
int n, m, b;
struct Q {
int l = -1, r = -1, id = -1, bl;
bool operator < (Q a) {
return (bl ^ a.bl) ? bl < a.bl : ((bl & 1) ? r < a.r : r > a.r);
}
} q[50005];
void add(long long x) {
sum += cnt[x] * 2 + 1;
++cnt[x];
}
void del(long long x) {
sum -= cnt[x] * 2 - 1;
--cnt[x];
}
int main() {
memset(cnt, 0, sizeof(cnt));
scanf("%d%d", &n, &m);
b = sqrt(n * n / m * 1.0);
for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
for (int i = 1; i <= m; i++) {
scanf("%d%d", &q[i].l, &q[i].r);
q[i].id = i;
q[i].bl = q[i].l / b;
}
sort(q + 1, q + m + 1);
for (int k = 1, i = 1, j = 0; k <= m; k++) {
while (j < q[k].r) add(a[++j]);
while (i > q[k].l) add(a[--i]);
while (j > q[k].r) del(a[j--]);
while (i < q[k].l) del(a[i++]);
if (i == j) {
ans[q[k].id] = 0;
ans1[q[k].id] = 1;
} else {
ans[q[k].id] = sum - (j - i + 1);
ans1[q[k].id] = 1ll * (j - i + 1) * (j - i);
long long g = __gcd(ans[q[k].id], ans1[q[k].id]);
ans[q[k].id] /= g;
ans1[q[k].id] /= g;
}
}
for (int i = 1; i <= m; i++) printf("%lld/%lld\n", ans[i], ans1[i]);
return 0;
}
各种优化都试过了(包括快读,奇偶性等)
但还是TLE #7-9
求Dalao帮助