题目链接:https://www.luogu.com.cn/problem/P1908
示例程序:
#include <bits/stdc++.h>
using namespace std;
const int maxm = 1e7 + 5, inf = 1e9;
int ls[maxm], rs[maxm], tr[maxm], rt = 1, idx = 1, n;
long long ans;
void push_up(int u) {
tr[u] = tr[ls[u]] + tr[rs[u]];
}
void add(int p, int l, int r, int &u) {
if (!u) u = ++idx;
if (l == r) {
tr[u]++;
return;
}
int mid = l + (r - l) / 2;
(p <= mid) ? add(p, l, mid, ls[u]) : add(p, mid+1, r, rs[u]);
push_up(u);
}
int query(int L, int R, int l, int r, int u) {
if (!u)
return 0;
if (L <= l && r <= R)
return tr[u];
int res = 0, mid = (l + r) / 2;
if (L <= mid) res += query(L, R, l, mid, ls[u]);
if (R > mid) res += query(L, R, mid+1, r, rs[u]);
return res;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
int a;
scanf("%d", &a);
if (a < inf) ans += query(a+1, inf, 1, inf, 1);
add(a, 1, inf, rt);
}
printf("%lld\n", ans);
return 0;
}