CSP-S2019 树上的数(并查集,dfs)
\(n\) 树。\(n\) 排列卡片。\(i\) 卡片初始在 \(p_i\)。每次删一条边可以交换两端卡片。删光边最后卡片 \(i\) 位置 \(P_i\)。求字典序最小 \(P\)。
字典序最小果断贪,考虑卡片位置变化对限制带来的变化的本质。
首先压缩“删边顺序”。
一条边删了以后两边的相对顺序就不重要了。所以只在乎 dsu 序,也就是对于每个点来说 相连的边的删除顺序。
每个卡片的位置变化都是一条至少有一条边的路径。考虑这条路径对 dsu 序带来的变化是怎么样的:
-
对于起点,起边是起点删的第一条边。
-
对于终点,终边是终点删的最后一条边。
-
对于路径上相邻两条边 \(i, j\),共享端点 \(u\),\(u\) 的删边顺序中 \(j\) 在 \(i\) 之后且删除顺序相邻。
因此每个点 \(u\) 的顺序用首删边 mi[u] 末删边 mx[u] 和若干个连续区间(可以用并查集维护,根是区间左端点,维护深度信息表示到左端点距离,维护区间大小)。
枚举卡片 \(i\) 每次从 \(p_i\) 开始 dfs 找最小 \(P_i\) 即可。

浙公网安备 33010602011771号