Loading

CSP-S2019 树上的数(并查集,dfs)

CSP-S2019 树上的数

\(n\) 树。\(n\) 排列卡片。\(i\) 卡片初始在 \(p_i\)。每次删一条边可以交换两端卡片。删光边最后卡片 \(i\) 位置 \(P_i\)。求字典序最小 \(P\)

CODE

字典序最小果断贪,考虑卡片位置变化对限制带来的变化的本质。

首先压缩“删边顺序”。

一条边删了以后两边的相对顺序就不重要了。所以只在乎 dsu 序,也就是对于每个点来说 相连的边的删除顺序

每个卡片的位置变化都是一条至少有一条边的路径。考虑这条路径对 dsu 序带来的变化是怎么样的:

  1. 对于起点,起边是起点删的第一条边。

  2. 对于终点,终边是终点删的最后一条边。

  3. 对于路径上相邻两条边 \(i, j\),共享端点 \(u\)\(u\) 的删边顺序中 \(j\)\(i\) 之后且删除顺序相邻。

因此每个点 \(u\) 的顺序用首删边 mi[u] 末删边 mx[u] 和若干个连续区间(可以用并查集维护,根是区间左端点,维护深度信息表示到左端点距离,维护区间大小)。

枚举卡片 \(i\) 每次从 \(p_i\) 开始 dfs 找最小 \(P_i\) 即可。

posted @ 2022-09-15 19:24  Pizza1123  阅读(74)  评论(0)    收藏  举报