P4097 [HEOI2013]Segment(李超树)
传送门 题意: 现在需要维护两种操作,一种是插入一条线段,另一种是询问 \(x=k\) 时,最上方线段的编号,如有多个线段处于最大值状态,那么就输出编号最小的。 强制在线。 思路: 这就是一个李超树的模板题... 李超树一般就可以用来维护一些跟线段、直线有关的问题,比如询问当 \(x=x_0\) 时,所有线段的最大值、最小值等等,也可以用来维护凸包什么的。 写法比普通线段树写起来稍微细节要多点,核心思想感觉还是标记永久化?每次如果在一段区间上面存在交点,那么就保留优势段更长的线段,然后下放另外一半;每次询问的时候跑到最下面答案就出来了。 细节详见代码吧,主要关于空间有个问题还不是很懂,这个题我开 \(8\) 倍空间才能过,讲道理 \(4\) 倍应该够了呀。。有点谜感觉。。。 #include < bits / stdc ++. h > using namespace std ; typedef long long ll ; const int N = 1e5 + 5 , MAX = 50005 ; int n ; struct node { bool sign ; int id ; double k , b ; void upd ( int _id , double _k , double _b ) { id = _id , k = _k , b = _b ; } } tr [