逆序对权值线段树动态开点MLE
  • 板块P1908 逆序对
  • 楼主senak
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/5/22 11:03
  • 上次更新2024/5/22 16:12:42
查看原帖
逆序对权值线段树动态开点MLE
1201076
senak楼主2024/5/22 11:03
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#define int long long
const int N = 1e9 + 7;
using namespace std;
const int M = 5e5 + 5;
struct node {
    int sum = 0;
    int l = 0, r = 0;
}tr[M * 30];
#define ls(x) (tr[x].l)
#define rs(x) (tr[x].r)
#define sum(x) tr[x].sum  
int tot = 1;
void pushup(int x) {
    sum(x) = sum(ls(x)) + sum(rs(x));
}
void pushdown(int x) {
    if (!ls(x))ls(x) = ++tot;
    if (!rs(x))rs(x) = ++tot;
}
void upd(int x, int l, int r, int pos, int k) {
    if (l == r) {
        sum(x) += k;
        return;
    }
    int mid = (l + r - 1) / 2;
    pushdown(x);
    if (pos <= mid)upd(ls(x), l, mid, pos, k);
    else upd(rs(x), mid + 1, r, pos, k);
    pushup(x);
}
int que(int x, int l, int r, int L, int R) {
    if (L <= l && r <= R)return sum(x);
    if (l > R || r < L)return 0;
    pushdown(x);
    int mid = (l + r - 1) / 2;
    return
        que(ls(x), l, mid, L, R) +
        que(rs(x), mid + 1, r, L, R);
}
void add(int pos, int k) {
    upd(1, 1, N, pos, k);
}
int que(int L, int R) {
    return que(1, 1, N, L, R);
}
void insert(int x) { 
    add(x, 1);
}
void solve() {
    int n; cin >> n;
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        int  x; cin >> x;
        ans += que(x + 1, N);
        insert(x);
    }cout << ans << endl;
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    solve();
	return 0;
}
2024/5/22 11:03
加载中...