FHQ Treap 求调
查看原帖
FHQ Treap 求调
800884
Weekoder楼主2025/2/6 11:32

rt

#include <bits/stdc++.h>

#define debug(x) (cout << #x << " " << x << "\n")

using namespace std;

using ll = long long;

const int N = 1e5 + 5;

int n, m, tot, val[N], dat[N], sz[N], ch[N][2], root, ans, last, tag[N];

int New(int v) {
    val[++ tot] = v;
    dat[tot] = rand();
    sz[tot] = 1;
    return tot;
}

void do_rev(int cur) {
    if (!tag[cur]) return ;
    swap(ch[cur][0], ch[cur][1]);
    tag[ch[cur][0]] ^= 1, tag[ch[cur][1]] ^= 1;
    tag[cur] = 0;
}

void pushup(int cur) { sz[cur] = sz[ch[cur][0]] + sz[ch[cur][1]] + 1; }

void pushdown(int cur) {
    if (!cur) return ;
    do_rev(cur);
    if (ch[cur][0]) do_rev(ch[cur][0]);
    if (ch[cur][1]) do_rev(ch[cur][1]);
}

void split(int cur, int v, int &x, int &y) {
    if (!cur) { x = y = 0; return ; }
    pushdown(cur);
    if (val[cur] <= v) {
        x = cur, split(ch[cur][1], v, ch[cur][1], y);
    } else {
        y = cur, split(ch[cur][0], v, x, ch[cur][0]);
    }
    pushup(cur);
}

int merge(int x, int y) {
    if (!x || !y) return x + y;
    if (dat[x] < dat[y]) {
        pushdown(x);
        ch[x][1] = merge(ch[x][1], y);
        pushup(x);
        return x;
    } else {
        pushdown(y);
        ch[y][0] = merge(x, ch[y][0]);
        pushup(y);
        return y;     
    }
}

void insert(int v) {
    int x, y;
    split(root, v, x, y);
    int z = New(v);
    root = merge(merge(x, z), y);
}

void del(int v) {
    int x, y, z;
    split(root, v, x, z);
    split(x, v - 1, x, y);
    y = merge(ch[y][0], ch[y][1]);
    root = merge(merge(x, y), z);
}

int rnk(int v) {
    int x, y;
    split(root, v - 1, x, y);
    int ans = sz[x] + 1;
    root = merge(x, y);
    return ans;
}

int kth(int cur, int k) {
    int lsz = sz[ch[cur][0]];
    if (k == lsz + 1) return val[cur];
    if (k <= lsz) return kth(ch[cur][0], k);
    return kth(ch[cur][1], k - lsz - 1);
}

int get_pre(int v) {
    int x, y;
    split(root, v - 1, x, y);
    int ans = kth(x, sz[x]);
    root = merge(x, y);
    return ans;
}

int get_suc(int v) {
    int x, y;
    split(root, v, x, y);
    int ans = kth(y, 1);
    root = merge(x, y);
    return ans;
}

void output(int cur) {
    if (!cur) return ;
    pushdown(cur);
    output(ch[cur][0]);
    cout << val[cur] << " ";
    output(ch[cur][1]);
}

void rev(int l, int r) {
    int x, y, z;
    split(root, r, x, z);
    split(x, l - 1, x, y);
    tag[y] ^= 1;
    do_rev(y);
    root = merge(merge(x, y), z);
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) insert(i);
    while (m --) {
        int l, r; cin >> l >> r;
        rev(l, r);
    }
    output(root);
    return 0;
}
2025/2/6 11:32
加载中...