1 条题解
-
0
题解:动态树的三元组计数
问题转化
初始一棵 个节点的树,按顺序删除节点 ,删除时将该节点的所有存活邻居两两连边(形成团)。求每次删除前,有序三元组 的数量,满足 存活且 、 在当前图中相邻。
核心思路
三元组 等价于一条长度为 的路径,中间点为 ,两端 和 是 的不同邻居。因此答案为 ,其中 是 在当前图中的度数。
动态维护
删除节点 时:
- 的所有存活邻居 会互相连接,因此每个 的度数变化为:,其中 是 的存活邻居数(因为 失去 这条边,但获得与其他 个邻居的边)。
- 更新贡献: 变化时, 随之改变。
- 删除 后, 不再贡献。
数据结构
使用并查集维护“团合并”。当节点被删除时,其邻居们形成一个团,可以将它们合并为一个“超点”,用并查集维护超点的大小和度数。
实际上,删除 后, 的所有邻居合并为一个新节点(代表一个团),该新节点的度数为原邻居度数之和减去 内部边数。
实现方法
倒序处理:从空图开始,按 的顺序加入节点 。加入 时,将 与所有已有邻居(即原树中 的编号更大的邻居)所在超点连接,并更新答案。
维护:
- :超点 的原始节点个数
- :超点 的度数
- 答案贡献为
加入 时,设 的邻居超点集合为 ,将它们合并为一个新超点 ,,(因为内部边不计入度数)。然后更新答案。
复杂度
并查集维护,。
- 1
信息
- ID
- 6083
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者