logo

yaohaoyou

春节

AT_arc213_c Double X 题解

2026-01-29 Views 题解 | 线段树 | 网络流769字4 min read

题目传送器

更爽的阅读体验

搬运官方题解做法。

显然 x1,x2,x3,x4x_1,x_2,x_3,x_4 满足在以 kk 为根的 TTUU 中两两之间的 LCA 都是 kk,这其实是一个类似于二分图匹配的问题。具体的,可以将这个问题转化成对于 kkTT 上的儿子 a1,a2,,adegTka_1,a_2,\dots,a_{degT_k},和在 UU 上的儿子 b1,b2,,bdegUkb_1,b_2,\dots,b_{degU_{k}} 之间,若一个点 xxaia_ibjb_j 的子树中,则连接一条 (i,j,Ax)(i,j,A_x) 的边,代表一对匹配。这一步转化后,现在只需要求这个二分图中找到大小为 4 的最小匹配。

由于二分图两边点数的总和只有 degTk+degUkdegT_k+degU_k,所以可以对每个 kk 考虑 O~(degTk+degUk)\tilde{\mathcal O}(degT_k+degU_k) 解决这个问题,总复杂度就只有 O~(n)\tilde{\mathcal O}(\sum n)。首先显然重边只用保留边权最小的一条。其次事实上,只要对每个左部点保留边权前 4 小的边也不会影响答案。证明考虑若选择了第 5 小的边,则剩余的 3 组匹配一定无法完全包含前 4 小的边的右端点,所以可以将第 5 小的边调整到没选的前 4 小的边一定不劣。所以每个左部点直接保留前 4 小的边即可,总边数就缩到 O(degTk+degUk)\mathcal O(degT_k+degU_k) 级别了。由于流量 flow=4flow=4 很小,直接用费用流跑匹配,使用 Primal-Dual 能做到 O(nlogn)\mathcal O(n\log n),实测直接 SSP 也能过。

现在思考如何建出这个图,即考虑如何快速求出以 kk 为根时,在 axa_x 子树中前 4 小的不相同的边。考虑在 UU 中将 bib_i 的子树内的点 vvTT 中染色成 ii,则需要在 TT 中找 axa_x 的子树中 4 种颜色的点的最小值。注意到我们实际上不可能每次吧 kk 提出来做根跑 dfs,但是可以将 kk 的邻域分为 kk 的父亲和 kk 的儿子,kk 的父亲对应的子树直接全部染色成 0,每次换根时就只会修改一个位置了,剩下的儿子子树的染色过程可以在 UU 上用 dsu on tree 在 O(nlogn)\mathcal O(n\log n) 做完。再开一棵线段树维护当前节点对应的 TT 上欧拉序区间的最小的 4 种颜色和权值,在 TT 上做线段树区间查即可,总复杂度为 O(nlog2n+Flow(n))\mathcal O(n\log^2 n+Flow(n))Flow(n)Flow(n) 为边数为 nn 的费用流的复杂度。

注意最短路要开 long long,虽然最后的增广最短路只会有 2×1092\times 10^9,但过程中可能需要经过的最短路会 <2×109<-2\times 10^9

code

EOF