DTOJ 4653. 「CSP-S 2019」树上的数

题意

给定一个大小为 nn 的树,它共有 nn 个结点与 n1n − 1 条边,结点从 1n1 \sim n 编号。初始时每个结点上都有一个 1n1 \sim n 的数字,且每个 1n1 \sim n 的数字都只在恰好一个结点上出现。

接下来你需要进行恰好 n1n − 1 次删边操作,每次操作你需要选一条未被删去的边,此时这条边所连接的两个结点上的数字将会交换,然后这条边将被删去。

n1n − 1 次操作过后,所有的边都将被删去。此时,按数字从小到大的顺序,将数字 1n1 \sim n 所在的结点编号依次排列,就得到一个结点编号的排列 PiP_i。现在请你求出,在最优操作方案下能得到的字典序最小PiP_i

QSE3qS.png

如上图,蓝圈中的数字 151 \sim 5 一开始分别在结点 ②、①、③、⑤、④。按照 (1)(4)(3)(2) 的顺序删去所有边,树变为下图。按数字顺序得到的结点编号排列为 ①③④②⑤,该排列是所有可能的结果中字典序最小的。

QSENPs.png

数据范围:

测试点编号 $n\le $ 特殊性质
121\sim 2 1010
343\sim 4 160160 树的形态是一条链
575\sim 7 2×1032\times 10^3 树的形态是一条链
898\sim 9 160160 存在度数为 n1n − 1 的结点
101210\sim 12 2×1032\times 10^3 存在度数为 n1n − 1 的结点
131613\sim 16 160160
172017\sim 20 2×1032\times 10^3

对于所有测试点:1T101 \le T \le 10,保证给出的是一个树。

题解

吐槽:

几个月后再回过头来看这道考场上完全自闭的题,没看题解按自己新的想法写了半天过了。其实思路非常自然,完全没有之前想象的神仙。虽然确实有一定细节需要耗费较多时间(指以我的垃圾思考力),但至少链和菊花图的分都比较好拿,也不知道当时在干什么。

可能还是临场心态的问题吧,当时想着18年人均AK的D1,然后一开始没什么想法就真的很绝望,于是在自闭中结束了考试。现在想来还是好可惜啊,按照这个思路在考试还剩2.5h的情况下至少能多拿链+菊花图的50pts吧(一开始试验了链的代码只有1.5k,菊花图应该更好写)。之前考场的心态一直不太对,总想着能拿多少分,会不会被别人区分掉。其实真正的目标应该考出自己应有的实力,不要留下遗憾吧。这样就算没考好,也能够问心无愧地说一句技不如人,而不是重新审视这场考试再来后悔莫及。

希望省选,不要带着遗憾退役,毕竟OI生涯至今并没有任何一场自己满意的考试(也没考过几次就是了)。

正话:
显然按位考虑每个数,尽量使它放到编号最小的点上。问题在于如何判断一个数是否可以从uu号点出发恰好走到vv号点:将这个转化到边的排列顺序的限制上(因为限制就在于每条边恰好用一次),画图可知等价于对于经过的一系列边,每相邻两条在相交的点的所有边中的顺序是相邻的,且在uu上的边一定是u的边中最先取的,同理在v的是最后,容易感性认知 证明其充分必要性。
于是用标记数组存每条边在两个端点上是否有相邻的限制。同时,在一个点的连边中的相邻限制关系还不能构成环,用并查集维护一下即可。特殊地,还要考虑一个点的一条边是最先/最后取的情况,如果最先和最后取的边在同一并查集上,那么这个并查集必须包含这个点的所有边。直接做是O(n3)O(n^{3})的,预处理当前的点能到达哪些节点,即可做到O(n2)O(n^{2})
(我是真的弱智吧,考场上怎么能没有想法啊???)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章