可持久化线段树与线段树合并、分裂学习笔记

可持久化易错点

  1. 进入左右儿子时把 lc(u) 写成了 lc(x)
  2. 注意主席树到底修改了啥,是增加还是覆盖。如果是增加,那么就要在原基础上增加,不能直接赋值。如果是覆盖,则必须直接给叶子赋值,不能在原基础上修改。但是这两种情况都要继承原基础的左右儿子。
  3. 每次修改的时候记得 ++tot
  4. 注意查询的时候如果两边互相影响,那么递归的时候要减去另一边的贡献。
  5. 多指针搜索记得作差。
  6. 每次修改是在上一次修改的根的基础上的。
  7. ln==rn 时记得特判返回。
  8. 进入一个新节点时记得继承原基础的左右儿子。
  9. 无论是直接加的写法,还是 pushup 写法,两种都是一样的。除了直接加时需要边递归边加,而 pushup 则只需要在叶子加,其他祖先 pushup 即可。
  10. 离散化数组 lower_bound 的右边界是离散化数组的长度而不是原数组的长度!
  11. 进入某个版本时记得要用 root 数组映射到线段树上的 id。
  12. query 函数不要忘了 return
  13. 区查的时候 ln,rnql,qr 搞反了。
  14. 对于可能越界的区间查询,需要特判 if(qr<ln||ql>rn)return 0;
  15. 对于查询的区间,如果 l>r,要么在查询函数里特判 if(qr<ln||ql>rn)return 0;,要么查询之前就提前判断掉,不然会有奇怪错误。
  16. 动态开点时 u 记得传指针引用。
  17. 叶子结点记得 return;

线段树合并易错点

  1. 合并到两个同为空节点的时候,要注意此时是否会导致操作出问题,如果会就要特判掉。
  2. 线段树合并的时候区间记得提前 pushdown 再去合并。
  3. 在合并叶子节点的时候,如果直接 merge 左右儿子后 pushup 会有锅。解决办法是要么不用 pushup 处理合并,直接 sum[u]+=sum[v];要么就递归的时候多记录一个 ln,rn,来特判叶子节点。否则叶子结点的两个值没办法加在一起。
posted @   KS_Fszha  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示