题目链接:hysbz 2038 小Z的袜子
代码
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 50005;
struct State {
int l, r, id;
}Q[maxn];
int N, M, W[maxn], C[maxn], BSZ;
ll S, ans[maxn], sum[maxn];
ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a%b); }
bool cmp(const State& a, const State& b) {
if (a.l / BSZ == b.l / BSZ) return a.r < b.r;
return a.l / BSZ < b.l / BSZ;
}
void init () {
S = 0;
BSZ = sqrt(N) + 0.5;
memset(C, 0, sizeof(C));
for (int i = 1; i <= N; i++) scanf("%d", &W[i]);
for (int i = 1; i <= M; i++) {
scanf("%d%d", &Q[i].l, &Q[i].r);
Q[i].id = i;
}
sort(Q + 1, Q + N + 1, cmp);
}
ll query(int u, int v) {
if (u) {
for (int i = Q[u].l; i < Q[v].l; i++) {
C[W[i]]--;
S -= C[W[i]];
}
for (int i = Q[v].l; i < Q[u].l; i++) {
S += C[W[i]];
C[W[i]]++;
}
for (int i = Q[u].r + 1; i <= Q[v].r; i++) {
S += C[W[i]];
C[W[i]]++;
}
for (int i = Q[v].r + 1; i <= Q[u].r; i++) {
C[W[i]]--;
S -= C[W[i]];
}
} else {
for (int i = Q[v].l; i <= Q[v].r; i++) {
S += C[W[i]];
C[W[i]]++;
}
}
return S;
}
int main () {
while (scanf("%d%d", &N, &M) == 2) {
init();
for (int i = 1; i <= N; i++) {
ans[Q[i].id] = query(i-1, i);
sum[Q[i].id] = Q[i].r - Q[i].l + 1;
}
for (int i = 1; i <= M; i++) {
sum[i] = sum[i] * (sum[i]-1) / 2;
ll g = gcd(ans[i], sum[i]);
printf("%lld/%lld\n", ans[i] / g, sum[i] / g);
}
}
return 0;
}