李超线段树学习笔记

Hints

原理

对于每一个区间,维护这个区间中点权值最大的直线是谁。

凡是可能有贡献的直线,一定被统计了。

思想

首先想到的就是维护每一个点,这样的时间复杂度是(O(n)),所以想优化。

对于一段区间,如果新的直线全面覆盖,就打一个标记。

但是这样的区间很少。

所以不妨增大查询的时间复杂度到(O(log n)),维护出可能作为答案的线段。

所以假设一条线段可以作为一大段区间的点的贡献,加在线段树里面。

但是有可能一个区间里面的两条直线相交。

那么就只维护完全包含于这个区间的线段(剩下的维护在子区间当中),考虑什么时候可以作为答案。

就是中点处值最大的线段。

理由:假设有一条线段中点处权值更大,那么左右两个区间一定有一个区间被上面的线段完全覆盖,也就是我们维护的线段只对两个区间的一个有贡献。

不如维护成上面的那个,而把下面的那个丢到子区间当中呢。

细节

细节主要体现在(xl==xr)这个地方,这里可以在结构体(f())里面特判,原因是我们调用(k())的时候一定保证了(xl eq xr)

评价

神奇

例题

P4097 [HEOI2013]Segment

Code

原文地址:https://www.cnblogs.com/ChiTongZ/p/11272617.html