主席树学习笔记。
可持久化易错点
- 进入左右儿子时把
lc(u)
写成了 lc(x)
。
- 注意主席树到底修改了啥,是增加还是覆盖。如果是增加,那么就要在原基础上增加,不能直接赋值。如果是覆盖,则必须直接给叶子赋值,不能在原基础上修改。但是这两种情况都要继承原基础的左右儿子。
- 每次修改的时候记得
++tot
。
- 注意查询的时候如果两边互相影响,那么递归的时候要减去另一边的贡献。
- 多指针搜索记得作差。
- 每次修改是在上一次修改的根的基础上的。
- 当
ln==rn
时记得特判返回。
- 进入一个新节点时记得继承原基础的左右儿子。
- 无论是直接加的写法,还是
pushup
写法,两种都是一样的。除了直接加时需要边递归边加,而 pushup
则只需要在叶子加,其他祖先 pushup
即可。
- 离散化数组
lower_bound
的右边界是离散化数组的长度而不是原数组的长度!
- 进入某个版本时记得要用
root
数组映射到线段树上的 id。
query
函数不要忘了 return
。
- 区查的时候
ln,rn
与 ql,qr
搞反了。
- 对于可能越界的区间查询,需要特判
if(qr<ln||ql>rn)return 0;
。
- 对于查询的区间,如果
l>r
,要么在查询函数里特判 if(qr<ln||ql>rn)return 0;
,要么查询之前就提前判断掉,不然会有奇怪错误。
- 动态开点时 记得传指针引用。
- 叶子结点记得
return;
。
线段树合并易错点
- 合并到两个同为空节点的时候,要注意此时是否会导致操作出问题,如果会就要特判掉。
- 线段树合并的时候区间记得提前 pushdown 再去合并。
- 在合并叶子节点的时候,如果直接 merge 左右儿子后 pushup 会有锅。解决办法是要么不用 pushup 处理合并,直接
sum[u]+=sum[v]
;要么就递归的时候多记录一个 ln,rn
,来特判叶子节点。否则叶子结点的两个值没办法加在一起。
posted @
2025-01-30 18:24
KS_Fszha
阅读(
5)
评论()
编辑
收藏
举报
点击右上角即可分享
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验