可持久化线段树
同步: https://buringstraw.win/archives/78/ 写了棵可持久化线段树,因为模拟赛里用到了主席树,而我却从来没写过。。。 凭借自己对当年上过的课的印象写的, 因为翻了很多博客没看懂 概述 每当有修改操作时,把需要修改的节点复制一份,在新复制的节点上完成修改操作。这里的修改也包括对点与点连接结构的修改。然后将每个版本的根节点存入 root 数组。 结构 这棵线段树需要动态开点,所以要有 struct struct node { int l, r;//对应的区间 int ch[2];//0:左儿子,1:右儿子 int v;//值 } c[MAXN]; 然后要有装初始元素的数组和 root 数组 int a[MAXN], root[MAXN]; 还要记录最新的节点和最新的版本 int newp, newv 操作 所有操作中都要注意:递归操作之后 newp 会改变 建树 跟普通线段树差不多 要先将根节点的 l , r 初始化好 root[++newv] = ++newp; scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) { scanf("%d", a + i); } c[newp].l = 1; c[newp].r = n; void build (int p) { if (c[p].l == c[p]