1 条题解

  • 0
    @ 2025-12-11 7:37:58

    题解:动态树的三元组计数

    问题转化

    初始一棵 nn 个节点的树,按顺序删除节点 ii,删除时将该节点的所有存活邻居两两连边(形成团)。求每次删除前,有序三元组 (a,b,c)(a,b,c) 的数量,满足 a,b,ca,b,c 存活且 aba-bbcb-c 在当前图中相邻。

    核心思路

    三元组 (a,b,c)(a,b,c) 等价于一条长度为 22 的路径,中间点为 bb,两端 aaccbb 的不同邻居。因此答案为 bdeg(b)(deg(b)1)\sum_b deg(b)\cdot (deg(b)-1),其中 deg(b)deg(b)bb 在当前图中的度数。

    动态维护

    删除节点 xx 时:

    1. xx 的所有存活邻居 yy 会互相连接,因此每个 yy 的度数变化为:deg(y)deg(y)1+(k1)deg(y) \leftarrow deg(y) - 1 + (k-1),其中 kkxx 的存活邻居数(因为 yy 失去 xx 这条边,但获得与其他 k1k-1 个邻居的边)。
    2. 更新贡献:deg(y)deg(y) 变化时,deg(y)(deg(y)1)deg(y)\cdot (deg(y)-1) 随之改变。
    3. 删除 xx 后,xx 不再贡献。

    数据结构

    使用并查集维护“团合并”。当节点被删除时,其邻居们形成一个团,可以将它们合并为一个“超点”,用并查集维护超点的大小和度数。

    实际上,删除 xx 后,xx 的所有邻居合并为一个新节点(代表一个团),该新节点的度数为原邻居度数之和减去 22\cdot 内部边数。

    实现方法

    倒序处理:从空图开始,按 n,n1,,1n,n-1,\dots,1 的顺序加入节点 ii。加入 ii 时,将 ii 与所有已有邻居(即原树中 ii 的编号更大的邻居)所在超点连接,并更新答案。

    维护:

    • cnt[u]cnt[u]:超点 uu 的原始节点个数
    • deg[u]deg[u]:超点 uu 的度数
    • 答案贡献为 ucnt[u]deg[u](deg[u]1)\sum_u cnt[u] \cdot deg[u] \cdot (deg[u]-1)

    加入 ii 时,设 ii 的邻居超点集合为 SS,将它们合并为一个新超点 vvcnt[v]=1+uScnt[u]cnt[v] = 1 + \sum_{u\in S} cnt[u]deg[v]=uSdeg[u]Sdeg[v] = \sum_{u\in S} deg[u] - |S|(因为内部边不计入度数)。然后更新答案。

    复杂度

    并查集维护,O(nα(n))O(n \alpha(n))

    • 1

    「USACO 2023 US Open Platinum」Triples of Cows

    信息

    ID
    6083
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者