树上启发式合并能做的线段树合并都能做吗?线段树合并能做的树上启发式合并都能做吗?(此处仅考虑离线)
极限卡常情况下树上启发式合并和线段树合并分别能通过的极限数据是多少(评测环境 NOI LINUX2.0,对于树上启发式合并单点修改复杂度 O(1))?
线段树合并有哪些优化时间/空间的奇技淫巧?
删除结点能优化时间吗?为什么有的时候不删结点会 RE(确保空间是 O(nlog2n))?
怎样删除一颗不用的线段树(动态开点,要求时间复杂度与合并时同阶)?
众所周知,线段树合并有两种写法:
//直接合并,省空间,但仅支持离线.
int mrg(int x,int y,int l,int r){
if(!x||!y)return x+y;
if(l==r){sum[x]+=sum[y];return x;}
int mid(l+r>>1);
lc[x]=mrg(lc[x],lc[y],l,mid),rc[x]=mrg(rc[x],rc[y],mid+1,r);
psh_up(x),del(y);return x;
}
//新建结点,炸空间,但支持在线.
int mrg(int x,int y,int l,int r){
if(!x||!y)return x+y;
int now(0);new_nd(now);
if(l==r){sum[now]=sum[x]+sum[y];return now;}
int mid(l+r>>1);
lc[now]=mrg(lc[x],lc[y],l,mid),rc[now]=mrg(rc[x],rc[y],mid+1,r);
psh_up(now);return now;
}
- 欢迎分点解答!!!