今天看了一天的线段树,寒假写过,但是寒假连区间更新里的lazytag都没有理解,也不知道当时写的什么鬼了。
重要操作:
- 单点更新
- 单点查询
- 区间更新
- 区间查询
主要关于lazytag,其实就是一个标记,我理解的是,标记此区间已经计算正确,但是子区间的值还未更新,
所以最好在区间查询和更新时都下推一下tag。下推tag时的操作和具体题目有关。
题目:
HDU - 1754 题解
(单点更新,区间查询)HDU - 1698 题解
(区间更新)POJ - 3468 题解
(区间更新,区间查询)ZOJ - 1610 题解
(区间更新)HDU - 3308 题解
(区间更新)POJ-2528 题解
(区间更新+离散化) 代码还有点问题POj - 3264 题解
(无更新,纯区间查询) 所以又看了看RMQ的ST算法。HDU - 1255 题解
(扫描线 求面积)POJ - 1177 题解
(扫描线求周长)HDU-1542 题解
(扫描线求面积)
来写一个小总结吧,毕竟还要刷别的题,最近又要考组原了,害怕组原挂给我看。
线段树现在最主要是明白自己到底维护的是个怎样的值。
怎样根据左右儿子来更新父结点,还有lazytag到底是表示的什么,是表示此区间更新的次数,还是是否更新过。
有些题如果查询次数特别少,可以直接在更新时一直打tag,最后一遍推完,例如有些染色的题目。
注意build的时间复杂度是O(n) 。
关于扫描线:
很好的博客
我觉得这个博主讲的特别好,之后脑子清醒来捋一捋扫描线