首页 > 其他 > 详细

可持久化线段树

时间:2017-01-25 17:33:25      阅读:250      评论:0      收藏:0      [点我收藏+]
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]);
    }
} 

 

可持久化线段树

原文:http://www.cnblogs.com/9pounds15pence/p/6349644.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!