当前位置: 首页 > news >正文

树上DS方法汇总

:::info[约定]

记:

  • \(rt\) 为树根
  • \(a_x\)\(x\) 原本权值
  • \(fa[x],fa_x\)\(x\) 父亲
  • \(tr[x]\)\(x\) 子树集合
  • \(son[x]\)\(x\) 的儿子集合
  • \(d_x\)\(x\) 点深度
  • DS 泛指线段树、树状数组

:::

操作、查询无链

只会有单点与子树操作,通过 dfs 序将子树拍到序列上,成为区间问题,用任意 DS 维护。

链操作,单点查询

首先链可以拆成两条从上到下的路径,对它进行操作即可。

链、单点

\(cf_x=a_x-\sum_{s \in son[x]} a_s\)。如果更改的链为 \(u\sim v\)\(v\)\(u\) 祖先),查询的点为 \(p\)

  • 链加变为更改 \(cf_{fa[v]},cf_u\)
  • 单点查变为 \(p\) 的子树和

问题转化为单点加、子树和的形式,回到“操作、查询无链”。

单点加链和

\(s_x=a_x+sum_{fa[x]}\),即 \(x\)\(rt\) 的权值和。

  • 单点加变为 \(p\) 子树加
  • 链查询变为单点求 \(sum_u-sum_{fa[x]}\)

转化为子树加、单点和。

总结

操作、查询中带有链与单点,就将链转化为单点、单点转化为子树,使用单点与子树的方法解决。

链、子树

重要!链依旧可以拆成两个。

链加子树和

\(cf_x=a_x-\sum_{s \in son[x]} a_s\)

  • 链加转化为单点加
  • 子树和转化为子树和的子树和(先用差分做子树和算出原数组,在用原数组算出子树和)

对于子树和的子树和,考虑维护两个树状数组,BIT1 维护 \(cf_x\),BIT2 维护 \(cf_x\times d_x\)。单点加时直接修改两个BIT 的值,答案推式子可得:

\[\begin{aligned} \sum_{s\in tr[x]} \sum_{t\in tr[s]} cf_t &=\sum_{s\in tr[x]} cf_s(d_s-d_{fa[x]})\\ &=\sum_{s\in tr[x]} cf_s\times d_s-d_{fa[x]}\sum_{s\in tr[x]} cf_s \end{aligned}\]

于是问题转化为了单点修改子树查询。

子树加链和

\(s_x=a_x+sum_{fa[x]}\)

  • 链和转化为单点和
  • 子树加转化为子树的子树加(原本的子树加,在前缀和上高的点会对低的点前缀和产生影响,加更多)

依旧用 BIT1 维护 \(s_x\),BIT2 维护 \(s_x\times d_x\)。先考虑答案为 \(s_u-s_{fa[v]}\)\(v\)\(u\) 祖先)。

\(tr[x]\) 整体加 \(\alpha\) 时,有伪代码

\[\begin{aligned} \begin{aligned} &(\forall_{u\in tr[x]}\forall_{t\in tr[u]} s_t+=\alpha)\\ &\Rightarrow (\forall_{u\in tr[x]} s_u)+=(\alpha \times (d_u-d_{fa[x]}))\\ &\Rightarrow (\forall_{u\in tr[x]} s_u)+=\alpha\times d_u;(\forall_{u\in tr[x]} s_u)-=\alpha\times d_{fa[x]} \end{aligned} \end{aligned}\]

其中分号前的部分就是对 BIT2 的修改。问题再次转化为子树修改单点查询。

链修改、链查询

树链剖分即可。注意查询修改复杂度是 \(O(\log^2 n)\)

http://www.jsqmd.com/news/644575/

相关文章:

  • GeographicLib 技术指南:解决高精度地理计算的核心问题与架构解析
  • 如何在数字化课堂中实现自主学习的平衡?JiYuTrainer的教学优化方案
  • 热门的压力变送器厂家哪家靠谱? - 仪表人小余
  • JAVA 1.0 - 基础
  • 中国人饮食结构缺乏那些营养元素呢
  • 5分钟论文降AI实操指南 高效过审不丢核心 - 仙仙学姐测评
  • 2026奇点大会闭门报告首次流出(3D视觉大模型训练成本骤降67%的3个未公开架构设计)
  • 2026 年 3 月压力变送器品牌排行榜:优质生产厂家推荐与性价比选择指南 - 仪表人小余
  • Augment插件深度清理指南:如何彻底重置试用状态(支持多IDE版本)
  • 从磁偶极子建模到定位反演:一个完整 MATLAB 仿真系统解析
  • C++指针入门:10分钟掌握核心用法
  • 2026年4月13隔夜暗盘挂单排行榜
  • 2026年性价比高自费出书机构有哪些:五家优选评测 - 科技焦点
  • 3分钟让你的Windows 11重获新生:Win11Debloat系统优化指南
  • ECMWF CDS API 深度解析:解锁气候数据获取的5个高效实践
  • 3个关键步骤:ComfyUI-Impact-Pack图像增强插件完整使用指南
  • 如何在Windows 10/11上完美运行经典老游戏:DDrawCompat兼容性解决方案终极指南
  • 暗黑破坏神2存档编辑新纪元:告别复杂十六进制,拥抱可视化操作
  • 利用GitHub Actions自动化测试RWKV7-1.5B-G1A模型更新
  • 2026 方形不锈钢水箱选型解析 304 不锈钢水箱厂家实力参考 - 深度智识库
  • ThinkPad风扇智能控制终极指南:告别噪音,拥抱高效散热
  • APK Installer终极指南:高效管理Android应用的Windows神器
  • NoFences桌面分区工具:开源免费的Windows桌面整理解决方案
  • 西门子S7-300与MMV变频器Profibus-DP通讯实战:从硬件接线到PID调速完整流程
  • 2026私域直播平台深度实测:盘点5款热门平台,哪个更适合你? - 轻松带微笑
  • League Akari:英雄联盟客户端全能工具包深度解析
  • 告别黑盒:用objdump -S命令,让Linux二进制文件反汇编时自动关联源代码
  • 暗黑2存档编辑器终极解决方案:深度技巧解析与完整实战指南
  • cv_unet_image-colorization生产环境部署:支持批量处理+日志记录+错误重试机制
  • 如何用d2s-editor轻松编辑暗黑破坏神2存档:完整免费指南