其他分享
首页 > 其他分享> > 7.11 可持久化(主席树)

7.11 可持久化(主席树)

作者:互联网

\(\large\text{Date: 7.11}\)

可持久化

这个东西,能够维护一个数据结构的历史状态,主要做法就是(树状数据结构)开很多根对应不同版本的历史状态,然后每次修改就备份发生变化的节点,剩下的地方不变。可持久化主要是对空间有较大的优化。比如要开非常多棵线段树而空间会炸的时候就可以考虑整成可持久化线段树。然后这个东西结合权值线段树好像能搞一些别的花样?

主席树——可持久化线段树(可持久化数组)
其实主席树的原理一张图就能看懂(这个图哪都有),就是处理细节上要注意。
主席树区间修改。。。听说大多主席树的题目只用单点修改就够了
好像是树状数组套主席树?

这个东西的细节

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;

int n, m, q, cnt = 0;
int a[N], b[N];

namespace RE_tree {
#define lsp t[p].lx
#define rsp t[p].rx
#define mid (l + r >> 1)
    struct T {
        int lx, rx, val;
    }t[N << 5];
    int rt[N], cnt;

    int newnode(int p) {
        t[++cnt] = t[p];
        return cnt;
    }

    void build(int &p, int l, int r) {
        p = ++cnt;
        if(l == r) { t[p].val = 0; return; }
        build(lsp, l, mid); build(rsp, mid + 1, r);
    }

    void update(int &p, int l, int r, int x) {
        int tmp = p; p = newnode(p); t[p].val = t[tmp].val + 1; // void update(&p, l, r, x, v) (in this problem, v = 1)
        if(l >= r) return;
        x <= mid ? update(lsp, l, mid, x) : update(rsp, mid + 1, r, x);
    }

    int query(int u, int v, int l, int r, int k) {
        if(l >= r) return l;
        int x = t[t[v].lx].val - t[t[u].lx].val;
        return x >= k ? query(t[u].lx, t[v].lx, l, mid, k) : query(t[u].rx, t[v].rx, mid + 1, r, k - x);
    }
}using namespace RE_tree;

signed main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("Ans.txt", "w", stdout);
#endif
    scanf("%d %d", &n, &q);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        b[i] = a[i];
    }
    sort(b + 1, b + n + 1);
    m = unique(b + 1, b + n + 1) - b - 1;
    build(rt[0], 1, m);

    for(int i = 1; i <= n; i++) {
        int t = lower_bound(b + 1, b + m + 1, a[i]) - b;
        update(rt[i] = rt[i - 1], 1, m, t);
    }

    for(int i = 1; i <= q; i++) {
        int x, y, z;
        scanf("%d %d %d", &x, &y, &z);
        printf("%d\n", b[ query(rt[x - 1], rt[y], 1, m, z) ]);
    }
}

标签:持久,7.11,int,线段,rx,mid,主席,lx
来源: https://www.cnblogs.com/Doge297778/p/16465974.html