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

重看P4211 [LNOI2014] LCA 以及 P5305 [GXOI/GZOI2019] 旧词 题解

P4211 [LNOI2014] LCA
P5305 [GXOI/GZOI2019] 旧词

重看 P4211

\(\sum_{i=l}^{r} dep[LCA(i,x)]\),首先把 LCA 都求出来行不通,我们考虑转化计算贡献的形式,一个点的深度就是根到它的路径上的点的个数,两个点的 LCA 的深度就是根到这两点的路径上相交的点的个数,做法就出来了:

离线;依次加入点 \(i\) 的贡献,对应在根到 \(i\) 的路径上点权加 \(1\);对点 \(x\) 查询根到 \(x\) 路径上的点权和。
树剖线段树,时间复杂度 \(O(q \log n)\)

这是上次集训时学长的讲法,“相交的点的个数”这种说法十分好理解贡献是如何转化的,但是我做 P5305 时突然觉得这种说法不够本质(可能是我脑子不好使)导致这个转化方式的拓展性受限,现在从树上差分的角度重新理解这个做法,顺便解决该题的加强版 P5305。

“一个点的深度就是根到它的路径上的点的个数”,这其实是一种树上差分,可以假设树上深度的差分值表示 \(a[i]=dep[i]-dep[fa_i]=1\),那么 \(dep[i]=a[rt]+....+a[fa_i]+a[i]\)。因为差分值正好是 \(1\) 自然有多少个点深度就是多少,那么原做法我们可以这样理解其正确性:

每次要加入 \(i\) 的贡献时,我们让根到 \(i\) 的路径上对应的每一个点 \(k\) 的点权都加上一次 \(a[k]\),假设 \(x\) 是查询时的一个点,经过这样一次操作后,根到 \(LCA[i,x]\) 的路径上所有点增加的点权和就是 \(dep[LCA[i,x]]\)。同理加入了一个区间内所有点的贡献后再对路径求和,得到的就会是 \(\sum_{i=l}^{r} dep[LCA(i,x)]\)

P5305 题解

如果用一开始的视角去思考这道题会困在维护 \(k\) 次方和这一步,这是因为没有理解上一题中的点权 \(+1\) 指代的是差分值的出现次数而不是深度的覆盖次数之类的。

但用树上差分的视角去看这道题的操作会好理解许多。
现在题目变成求每个 LCA 的 \(k\) 次方深度的和,可以把差分值变成 \(b[i]=dep[i]^k-dep[fa_i]^k\),则求一下路径前缀和就可以得到 \(dep[i]^k\)
加贡献时把路径上的每一个点加上 \(b[i]\),求和时就能够得到 \(\sum_{i=l}^{r} dep[LCA(i,x)]^k\) 了。
具体维护时可以用线段树预处理出每个区间的 \(b\) 值,路径加时直接加对应的 \(b\) 就好了。

http://www.hskmm.com/?act=detail&tid=9788

相关文章:

  • 25.9.19随笔联考总结
  • 解题报告-P12025 [USACO25OPEN] Sequence Construction S
  • 解题报告-P12026 [USACO25OPEN] Compatible Pairs S
  • maxu
  • 20
  • 19
  • 18
  • 详细介绍:【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)
  • iOS 26 能耗检测实战指南 如何监测 iPhone 电池掉电、Adaptive Power 模式效果与后台耗能问题(uni-app 与原生 App 优化必看)
  • Transformer的个人理解
  • 国标GB28181平台EasyGBS如何实现企业园区视频监控一体化管理?
  • 360环视硬件平台为什么推荐使用米尔RK3576开发板?
  • 高质量票据识别数据集:1000张收据图像+2141个商品标注,支持OCR模型训练与文档理解研究
  • 1202_InnoDB中一条UPDATE语句的执行流程
  • 1201_mysql查询语句select执行流程
  • 记录---vue3项目实战 打印、导出PDF
  • 09
  • node.js安装(绿色版)
  • 08
  • selenium完整版一览 - 教程
  • 创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—开发环境搭建(二) - 创龙科技
  • ctfshow web55
  • ctfshow web58
  • ctfshow web57
  • 01
  • test 1
  • 关于如何计算空间
  • ECT-OS-JiuHuaShan框架实现的元推理,是新质生产力的绝对标杆
  • 线性调频信号(LFM)在雷达中的时域及频域MATLAB编程
  • Ubuntu 18.04 LTS 安装 6.10.10 内核 - 教程