据说点进来的84.16%的人都...
  • 板块学术版
  • 楼主Cht_master
  • 当前回复18
  • 已保存回复18
  • 发布时间2021/9/12 14:54
  • 上次更新2023/11/4 06:58:48
查看原帖
据说点进来的84.16%的人都...
261046
Cht_master楼主2021/9/12 14:54
  • 萌新提问关于树上启发式合并和线段树合并:
  1. 树上启发式合并能做的线段树合并都能做吗?线段树合并能做的树上启发式合并都能做吗?(此处仅考虑离线)

  2. 极限卡常情况下树上启发式合并和线段树合并分别能通过的极限数据是多少(评测环境 NOI LINUX2.0,对于树上启发式合并单点修改复杂度 O(1)O(1))?

  3. 线段树合并有哪些优化时间/空间的奇技淫巧?

  4. 删除结点能优化时间吗?为什么有的时候不删结点会 RE(确保空间是 O(nlog2nO(n\log_2n))?

  5. 怎样删除一颗不用的线段树(动态开点,要求时间复杂度与合并时同阶)?

  6. 众所周知,线段树合并有两种写法:

//直接合并,省空间,但仅支持离线.
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;
}
  • Two Questions:
    • 第二种版本在在线询问的情况下到底支不支持删除不用的结点?(个人认为不能删,但有的时候是对的有的时候是错的。)
    • 第二种版本对当前结点 u 的修改应该放在合并子树前还是合并子树后?(个人认为是合并子树后,但同样有的时候对有的时候错。)
  • 欢迎分点解答!!!
2021/9/12 14:54
加载中...