0
点赞
收藏
分享

微信扫一扫

洛谷P1908 逆序对 题解 权值线段树解法

题目链接: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;
}



举报

相关推荐

0 条评论