线段树模板
线段树----单点、区间加法,单点、区间覆盖,区间最大最小值 线段树基本知识 详解可以看这个:https://www.luogu.com.cn/problemnew/solution/P3372 摘录了一点点。。。 对于每一个子节点而言,都表示整个序列中的一段子区间;对于每个叶子节点而言,都表示序列中的单个元素信息;子节点不断向自己的父亲节点传递信息,而父节点存储的信息则是他的每一个子节点信息的整合。 有没有觉得很熟悉?对,线段树就是分块思想的树化,或者说是对于信息处理的二进制化——用于达到O(logn)O(logn)级别的处理速度,loglog以22为底。(其实以几为底都只不过是个常数,可忽略)。而分块的思想,则是可以用一句话总结为:通过将整个序列分为有穷个小块,对于要查询的一段区间,总是可以整合成kk个所分块与mm个单个元素的信息的并(0<=k,m<=\sqrt{n})(0<=k,m<= n )。但普通的分块不能高效率地解决很多问题,所以作为loglog级别的数据结构,线段树应运而生。 建树过程 void build ( ll rt , ll l , ll r ) { if ( l == r ) { st [ rt ] = a [ l ] ; return ; } ll mid = ( r + l ) >> 1 ; build ( rt << 1 , l , mid ) ;