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

【20250805省选训练】T3-简单树题

题目大意:

有一个 \(n\) 个点的带权树,有 \(q\) 次操作,分两种类型:

  1. 将一条边的权值改为 \(w\)
  2. 查询 \(\sum_{i = l}^{r} dep_{LCA(i, x)}\)
    \(n, q \le 60000, 7s\),强制在线。

解题思路:

考虑 \(dep_{LCA(i,x)}\) 可以套路地拆成 \(dep_{i} + dep_{x} - 2 \times dep_{LCA(i, x)}\)
那么我们对于 \(dep_{LCA(i,x)}\) 可以套路地拆成 \(i\)\(x\) 到根地路径的交集的和。

但是由于有了修改,我们既要考虑标号上的连续段也要考虑 \(dfn\) 的连续段。
所以我们想到让分块来优化掉第一个维度,并在里面放个数据结构消掉 \(dfn\) 的维度,这是本题的第一个难点,也是解决二维的问题的比较有用的方法

那么由于我们查询的是点到路径上的交集,但他的深度跟边长有关,所以我们可以将 \(x -> fa\) 的这条边的边权改为 \(x\) 的点权。

那么我们变成了求一个点到根的被这个块内经过的次数乘点权的总和。
块内的点到根的路径上的点都会被更新一次。
所以一个点被经过了多少次等于他子树内的块内的节点个数。

由于我们每次修改相当于改一个点的点权,所以这是简单的。
我们现在的问题变成了动态更新点权,求点到根的点券总和。

这个树剖是很好做到 \(O(\log^2 n)\) 的,但是时间复杂度太高。
由于树剖是支持链加链查的,所以我们考虑舍弃功能来换取时间复杂度。

点到路径上的权值等于有哪些点的子树内有它,那么维护 \(dfn\) 即可。
那么 \(dep_{LCA}\) 求完了,那么我们还要块内维护求 \(dep_{x}\)

但是这对于每个块来说只有单点查和整体查,所以即使他有 dfn 上的子树加也可以用树状数组方便地解决。
不过两个树状数组也能做区间加/查(((

散块也是简单的,直接暴力。

\(O(n \sqrt{n} \log n)\)

http://www.sczhlp.com/news/9977/

相关文章:

  • 让CPU省电的方法
  • IFEO劫持
  • GAS_Aura-Highlight Enemies
  • linux中node环境管理
  • 训练专有大模型的核心路径
  • 什么是 IAT Hook?
  • 学习新工具(覆盖程序员绝大部分需求的工具)(zz)
  • 20250811 之所思 - 人生如梦
  • 2025牛客多校第七场 双生、象牙 个人题解 - CUC
  • 大模型部署与应用的典型场景及技术挑战
  • 全球语言全覆盖:一款强大的多语言客服系统
  • Verify my blogs in Follow
  • MX-2025 盖世计划 C 班 Day 9 复盘
  • 3.2~3.4.2数据类型关键词
  • 三星SAMSUNG SCX-4521F 一体机驱动
  • macos 开放3306端口
  • GAS_Aura-GameMode
  • telnet localhost 3306 -bash: telnet: command not found
  • Python面向对象实战之扑克游戏
  • vim常见操作
  • 可能是校内题单题解(20250811)
  • 无痕检测是否注册iMessage服务,iMessages数据筛选,iMessage蓝号检测完美实现
  • FWT 快速沃尔什变换
  • GAS_Aura-Movement Input
  • 字符串常用方法
  • Linux常用工具
  • 8/11
  • 项目调试
  • C++小白修仙记_LeetCode刷题_算数运算