今天主要算是复习和进一步学习了线段树的相关知识,首先从最基本的单点更新,单线查询(或区间查询)到 区间更新,单点查询(区间查询)。
一般,这些线段树的问题的建树过程基本类似,在单点更新里,会用到pushpu操作,来利用孩子节点的信息更新本结点信息,但用不到pushdow。但单点查询很少,如果单点查询,树状数组写起来更方便。区间查询,因为当进行查询操作的时候,本区间l,r一定包含需求区间ql,qr,而且有三种情况,1,ql<=l<=r<=qr,这种情况直接返回本结点的查询结果即可,否则,l和r之间包含ql和qr,m=(l+r)/2, 2,当ql<=m,那么就需要查询左孩子(左边有需要更新的信息),3当qr>m,查询右孩子(右边有需要更新的信息)。还有区间修改,当然要用到懒惰标记,既然用到了这个,也需要用到pushdow操作,因为有时需要向下传递懒惰标记。其实,我感觉在区间修改上,懒惰数组才是线段树需要维护的东西,而比如求和的sum数组,只是在维护完结点信息后,或者查询时,更新出来的信息,当然,这个才是答案。
除了这些操作,还有求最大连续子区间问题,也是区间维护问题,这类问题一般都是维护三个值,最大连续区间长度,最大前缀长度,最大后缀长度。由于是连续区间问题,所以在查询时,比较最大连续区间长度的值,来决定接下来查询左孩子,还是右孩子,还是总区间。至于其他操作,都和一般的线段树区间更新,单点更新的操作几乎一样,但是更加复杂和麻烦,毕竟维护的东西多了。
还有经典问题,扫描线问题,这类问题的共同特点就是需要建立一个结构体来保存所有的扫描线,维护的根本信息是扫过的边的下位边-上位边,当然还会维护辅助信息,就是x轴的边长之类的东西。更新操作,和基本线段树更新一样,但一般没有查询操作,因为这种题一般都是枚举所有扫描线。
区间染色覆盖问题,和基本区间查询差不多。