李超树学习笔记

我们记录下这个区间的完全上位线段,如果不是完全上位,那么就往下传,所以我们x点的答案必然是从线段树那个点往上的所有线段的最大值,因为把不优的答案全部都优化掉了。
具体而言,我们把一条线段拆成log条线段,然后对于每条,往下传。往下传的时候比较中点处的数值。我们更新必定只往一个方向递归,所以时间复杂度是有保证的。那可不可能左边有更优的线段呢。首先我们要明确李超树维护的是包含这个节点的最上位线段,那如果这里都不优了,下面更不可能优了。所以我们是可以维护好的。然后李超树合并?就是正常线段树合并,然后每个点更新的时候把lazytag传下去。下传的时候要新开节点,时空应该都是\(mlog^{2}n\)的。代码有的比较优美,理解一下,特别是这个东西。还好理解吧,指针指的 也很正常

void push_down(int l,int r,int p,int i){
    int &j=d[p];
    int mid=(l+r)>>1;
    int bmid=cmp(get(i,mid),get(j,mid));
    if(bmid==1||(!bmid&&(i<j))) swap(i,j);
    //j在这个点上更优,i为原
    int bl=cmp(get(i,l),get(j,l)),br=cmp(get(i,r),get(j,r));
    if(br==1||(!br&&(i<j))) push_down(mid+1,r,p<<1|1,i);
    if(bl==1||(!bl&&(i<j))) push_down(l,mid,p<<1,i);
}

线段树合并的复杂度?考虑每个节点会被枚举到多少次。我们只有在两个节点都有的时候(也就是要删掉v)才会被枚举所以一个点被枚举到的条件就是他父亲被删除,所以我们每个点最多被删除1次,这部分时间复杂度正确。再来看其他的,我们每一个继承空的树,次数必然少于删除点的数量,因为是从上面递归下来的,所以时间复杂度为线段树的大小之和。还是挺优美的。

posted @ 2025-07-09 10:17  wuhupai  阅读(12)  评论(0)    收藏  举报