zoukankan      html  css  js  c++  java
  • 可持久化线段树

    struct Node {
        int val;
        Node *ch[2];
    };
    
    int a[maxn], n;
    Node *root[maxn];
    
    Node* sgtIns(Node* q, int pos) { // 在q的基础上将pos这个位置的数+1, 并返回一个新的线段树的根
        int l = 0, r = n;
        Node *s = new Node, *p = s;
        while (l < r) {
            p->val = q ? q->val + 1 : 1;
            int mid = (l + r)>> 1;
            if (pos <= mid) {
                p->ch[1] = q ? q->ch[1] : 0;
                p = p->ch[0] = new Node;
                q = q ? q->ch[0] : 0;
                r = mid;
            } else {
                p->ch[0] = q ? q->ch[0] : 0;
                p = p->ch[1] = new Node;
                q = q ? q->ch[1] : 0;
                l = mid + 1;
            }
        }
        p->val = q ? q->val + 1 : 1;
        return s;
    }
    int main() {
        cin >> n;
        for (int i = 1; i <= n; ++ i) {
            cin >> a[i];
        }
        root[0] = 0;
        for (int i = 1; i <= n; ++ i) {
            root[i] = sgtIns(root[i - 1], a[i]);
        }
    } 
  • 相关阅读:
    记录输出时间
    ***灵感或者没想到的思想
    Managing Difficulties
    4.20
    单调队列
    背包
    线性DP
    可持久化数据结构
    平衡树
    点分治
  • 原文地址:https://www.cnblogs.com/9pounds15pence/p/6349644.html
Copyright © 2011-2022 走看看