树形数据结构杂技(以线段树为例)(貌似现在讲的都是线段树)
1、打标记(最基本)
对于区间修改操作,在向下递归的过程中,给代表区间刚好在修改区间内的节点打上标记,表示他的后代要有次修改,使得区间修改的复杂度由O(N)降为O(log n)。一般在某个点得到标记时更新他的真值,从这个点向下递归时会下传标记得出他儿子的真值以保证正确性。打标记要求标记可叠加(自己整式子去),由标记及一些辅助变量可知真值。需一个下传函数在该节点向下递归时被调用。
大部分可用标记永久化代替,但有些复杂的题难以被取代。
2、标记永久化
打完标记后不再下传,而是在向下递归的过程中给答案加上标记的贡献。复杂度与普通打标记差不多,但不需要额外的下传函数。
3、权值线段树(比较重要就另开了一个博客)
4、可持久化:可持久化线段树学习笔记
5、动态开点线段树
发现普通的线段树在一些情况下会MLE或有很大的空间空置率,此时可以动态开点。用指针最适用;用数组模拟指针更方便、常数小,但需知道空间上限。
常用于树套树
6、扫描线
以上杂技,是否适用应看题而定。即使不用在线段树上,思路也很有启发意义。