线段树合并[学习笔记]
前置知识: 动态开点线段树/主席树 线段树合并,跟名字一样,就是合并两颗线段树的信息… 合并两颗线段树的方法是 递归下去一直合并两个如果俩节点都有…就新建一个维护当前两个的信息然后取而代之 如果只有一个有 那就返回那一个就够了… 这个blog内借鉴了一些洛谷的题解…因为作者实在菜的可怜 ( 懒 ) 先放个 板子题 吧 求子树几个比他权值大的 inline int Merge(int u , int v) { if(!u || ! v) return u | v ; int t = ++ cnt ; sum[t] = sum[u] + sum[v] ; ls[t] = Merge(ls[u] , ls[v]) ; rs[t] = Merge(rs[u] , rs[v]) ; return t ; } 就像是这样… 然后每次递归到最底层 下属信息合并…然后查询 最后输出,没了。 // luogu-judger-enable-o2 //Isaunoya #include<bits/stdc++.h> using namespace std ; inline int read() { register int x = 0 ; register int f = 1 ; register char c = getchar() ; for( ; ! isdigit(c) ; c =