RT,这个题因为涉及线段树合并的时候,每个位置的值要加上子树中的后缀最大值,所以当我合并到一个空子树的时候,我没有去打懒标记,反而是直接暴力下放(就是我懒得写)。这样的复杂度是多少呢?个人认为貌似不能视为普通线段树合并的最坏情况,也即 O(nlogn) 。我虽然通过了本题,但是时间非常紧。以下是我暴力合并部分的代码。
void add(int p,int l,int r,int v){
if(!p||!v) return ;
if(l==r){
maxn[p]+=v;
return ;
}
int mid=(l+r)>>1;
add(ls[p],l,mid,v);
add(rs[p],mid+1,r,v);
push_up(p);
}
int merge(int x,int y,int l,int r,int rmax,int rmay){
if(!x){
add(y,l,r,rmax);
return y;
}
if(!y){
add(x,l,r,rmay);
return x;
}
if(l==r){
maxn[x]+=rmay;
return x;
}
int mid=(l+r)>>1;
ls[x]=merge(ls[x],ls[y],l,mid,max(rmax,maxn[rs[x]]),max(rmay,maxn[rs[y]]));
rs[x]=merge(rs[x],rs[y],mid+1,r,rmax,rmay);
push_up(x);
return x;
}