Hints
原理
对于每一个区间,维护这个区间中点权值最大的直线是谁。
凡是可能有贡献的直线,一定被统计了。
思想
首先想到的就是维护每一个点,这样的时间复杂度是(O(n)),所以想优化。
对于一段区间,如果新的直线全面覆盖,就打一个标记。
但是这样的区间很少。
所以不妨增大查询的时间复杂度到(O(log n)),维护出可能作为答案的线段。
所以假设一条线段可以作为一大段区间的点的贡献,加在线段树里面。
但是有可能一个区间里面的两条直线相交。
那么就只维护完全包含于这个区间的线段(剩下的维护在子区间当中),考虑什么时候可以作为答案。
就是中点处值最大的线段。
理由:假设有一条线段中点处权值更大,那么左右两个区间一定有一个区间被上面的线段完全覆盖,也就是我们维护的线段只对两个区间的一个有贡献。
不如维护成上面的那个,而把下面的那个丢到子区间当中呢。
细节
细节主要体现在(xl==xr)这个地方,这里可以在结构体(f())里面特判,原因是我们调用(k())的时候一定保证了(xl eq xr)
评价
神奇