实施持久性树的问题

时间:2019-03-20 07:39:09

标签: persistent segment-tree

我正在尝试实现持久段树。查询有2种类型:1和2。

1 ind val:将数组中ind的值更新为val

2 k l r:在第k次更新操作之后,找到从索引l到r的元素之和。

我已经正确实现了更新和查询功能,并且它们在数组上正常工作。但是,当我形成不同的版本时,就会出现问题。基本上这是我的代码

while (q--) {
        cin >> type;
        if (type == 1) {
            cin >> ind >> val;

            node *t = new node;
            *t = *ver[size - 1];
            update(t, ind, val);
            ver.pb(t);
            size++;

        }

    }

cout << query(ver[0], 0, 1) << ' ' << query(ver[1], 0, 1) << query(ver[2], 0, 1);

现在的问题是它也在更改所有节点(即数组)的参数。这意味着3次更新后,所有版本都将存储最新的树。这可能是因为我没有正确分配新指针。对新指针所做的更改将反映在数组中的所有指针中

例如,如果我输入此内容

5
1 2 3 4 5
2
1 1 10
1 0 5

其中5是数组中的元素数,其后是数组。然后是q,查询数量,然后是所有查询。进行更新后,所有3个版本的(l,r)=(0,1)的查询函数的值都是15。但是应该是3、11、15。我在做什么错

1 个答案:

答案 0 :(得分:1)

所以我们说我们有一些简单的分段树,如下所示:

enter image description here

对于持久性段树,在更新过程中,我们为所有更改的节点生成新节点,并在需要时替换指向新节点的指针,因此,假设我们更新了节点4,则得到了这样的持久性段树(标记为*的新节点) ):

enter image description here

您要做的就是替换根目录并复制所有数据,这样您将获得以下信息:

enter image description here