RT,昨天调了一中午,然后还是T10个点。。
代码:
#include <bits/stdc++.h>
using namespace std;
inline int input() {
register int x = 0,f = 1;
register char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') f = -1;
c = getchar();
}
while (c <= '9' && c >= '0') {
x = (x << 3) + (x << 1) + (c ^ 48);
c = getchar();
}
return x * f;
}
int n,m,a[50010],vis[50010],ans = 0,blo,son[50010],mom[50010];
struct Query {
int l;
int r;
int idx;
bool operator < (const Query& b) const {
return l / blo == b.l / blo ? (r == b.r ? false : (l / blo & 1) ^ (r < b.r)) : l < b.l;
}
}q[50010];
int gcd(const int& n,const int& m) {
return m ? gcd(m,n % m) : n;
}
inline int add(const int& u) {
ans += vis[a[u]];
++vis[a[u]];
}
inline int del(const int& u) {
--vis[a[u]];
ans -= vis[a[u]];
}
int main() {
// freopen("P1494_1.in","r",stdin);
// freopen("P1494.out","w",stdout);
n = input();
m = input();
blo = sqrt(n);
for (register int i = 1; i <= n; ++i) a[i] = input();
for (register int i = 1; i <= m; ++i) {
q[i].l = input();
q[i].r = input();
q[i].idx = i;
}
sort(q + 1,q + m + 1);
int l = q[1].l,r = l;
add(q[1].l);
for (register int i = 1; i <= m; ++i) if (q[i].l == q[i].r) {
son[q[i].idx] = 0;
mom[q[i].idx] = 1;
} else {
// cout << q[i].l << ',' << q[i].r << endl;
while (l > q[i].l) add(--l);
while (r < q[i].r) add(++r);
while (l < q[i].l) del(l++);
while (r > q[i].r) del(r--);
mom[q[i].idx] = (r - l) % 2 ? (r - l + 1) / 2 * (r - l) : (r - l) / 2 * (r - l + 1);
if (ans == 0) {
son[q[i].idx] = 0;
mom[q[i].idx] = 1;
} else {
int k = gcd(mom[q[i].idx],ans);
mom[q[i].idx] /= k;
son[q[i].idx] = ans / k;
}
}
for (register int i = 1; i <= m; ++i) printf("%d/%d\n",son[i],mom[i]);
return 0;
}