求教关于线段树合并的复杂度。
查看原帖
求教关于线段树合并的复杂度。
128870
chen_qian楼主2021/4/23 19:47

RT,这个题因为涉及线段树合并的时候,每个位置的值要加上子树中的后缀最大值,所以当我合并到一个空子树的时候,我没有去打懒标记,反而是直接暴力下放(就是我懒得写)。这样的复杂度是多少呢?个人认为貌似不能视为普通线段树合并的最坏情况,也即 O(nlogn)O(n\log{n}) 。我虽然通过了本题,但是时间非常紧。以下是我暴力合并部分的代码。

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;
}
2021/4/23 19:47
加载中...