ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

7.11 可持久化(主席树)

2022-07-11 12:37:24  阅读:132  来源: 互联网

标签:持久 7.11 int 线段 rx mid 主席 lx


\(\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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有