1 条题解
-
0
题解
思路
1. 把期望转成连通块统计量
固定一次询问。设一个连通块内能力值之和为 ,则该连通块中所有无序点对的乘积和为
记当前所有连通块的 之和为 ,并记常量 。全部连通点对的伤害和是 ,而点对总数是 ,所以答案为
并查集合并两个块时,若其能力值和分别为 ,那么 增加
因此只要维护每个根的能力值和,就能在一次合并中 更新统计量。
做法
2. tiny:逐次重建并查集
对每个询问新建并查集,依次加入 的边,再套用上式。
- 时间复杂度:;
- 空间复杂度:。
这也是小规模 Oracle。
3. star:星形关系前缀和
特殊性质保证第 条边为 。询问 只会产生一个非平凡连通块:中心 与叶子 。
对叶子能力值及其平方分别求前缀和,即可在 得到该块的能力值和与平方和,再计算答案。
- 时间复杂度:;
- 空间复杂度:。
4. prefix:只增加边
若所有询问都满足 ,按 从小到大排序询问。扫描边序列并把尚未加入的边合并到并查集,即可在每个询问处直接读取 。
- 时间复杂度:;
- 空间复杂度:。
这一层说明了“固定左端点时按右端点增量维护”的核心;满分算法在每个左端点块中复用它。
5. full:按左端点分块与可撤销并查集
取边编号块长 ,把询问按 所在块分组。考虑左端点块 。
5.1 短询问
若询问的 ,它完全位于一个块内。临时加入 的至多 条边,记录答案后撤销。
5.2 跨块询问
把跨块询问按 递增排序。并查集中永久保留 的边;每次询问再临时加入 的至多 条边,记录答案后只撤销这些临时合并。
并查集不做路径压缩,只按大小合并。每次合并把两个根原先的父亲、块和及全局统计量压入栈;回滚到快照时逆序恢复。永久部分不会被撤销。
5.3 正确性证明
对短询问,快照之后加入的边集合恰为 ,所以并查集连通划分与询问图相同。
对跨块询问,处理到右端点 时,永久部分恰为 ;临时部分恰为 。二者并集不重不漏,正好是 。回滚只删除临时部分,因此不会破坏后续右端点递增所需的永久状态。
并查集每次合并都按 更新 ,所以由第 1 节公式得到的值就是当前询问的伤害期望。算法正确。
5.4 复杂度
复杂度
共有 个左端点块。扫描永久右侧边以及临时加入块内边的总复杂度为
$$O\left(\left(\frac{m^2}{B}+qB\right)\log n+q\log q+n+m\right).$$其中 来自不做路径压缩、只按大小合并的并查集查找。取 ,可写成 量级;空间复杂度为 。
标准程序令 $B=\max(1,\lfloor 7m/(5\lfloor\sqrt q\rfloor)\rfloor)$;常数 只用于平衡永久区间与临时区间的实际开销,且下界 保证 时仍有合法分块。若永久边已经使全图连通,后续边不会改变答案,可以直接跳过。独立复核程序反向按右端点分块、让左侧边永久递减加入,使用对称但独立的实现。
6. 易错点
- 兼容表示连通性,不能只统计区间内直接出现的边。
- 自环和重边不会改变连通划分,但必须被输入与回滚逻辑安全处理。
- 分母是 ,因为分子 已经把每个无序点对计算了两次。
- 可撤销并查集不能使用路径压缩。
- 1
信息
- ID
- 1030
- 时间
- 3000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者