题意
给定一个大小为 的树,它共有 个结点与 条边,结点从 编号。初始时每个结点上都有一个 的数字,且每个 的数字都只在恰好一个结点上出现。
接下来你需要进行恰好 次删边操作,每次操作你需要选一条未被删去的边,此时这条边所连接的两个结点上的数字将会交换,然后这条边将被删去。
次操作过后,所有的边都将被删去。此时,按数字从小到大的顺序,将数字 所在的结点编号依次排列,就得到一个结点编号的排列 。现在请你求出,在最优操作方案下能得到的字典序最小的 。
如上图,蓝圈中的数字 一开始分别在结点 ②、①、③、⑤、④。按照 (1)(4)(3)(2) 的顺序删去所有边,树变为下图。按数字顺序得到的结点编号排列为 ①③④②⑤,该排列是所有可能的结果中字典序最小的。
数据范围:
测试点编号 | $n\le $ | 特殊性质 |
---|---|---|
无 | ||
树的形态是一条链 | ||
树的形态是一条链 | ||
存在度数为 的结点 | ||
存在度数为 的结点 | ||
无 | ||
无 |
对于所有测试点:,保证给出的是一个树。
题解
吐槽:
几个月后再回过头来看这道考场上完全自闭的题,没看题解按自己新的想法写了半天过了。其实思路非常自然,完全没有之前想象的神仙。虽然确实有一定细节需要耗费较多时间(指以我的垃圾思考力),但至少链和菊花图的分都比较好拿,也不知道当时在干什么。
可能还是临场心态的问题吧,当时想着18年人均AK的D1,然后一开始没什么想法就真的很绝望,于是在自闭中结束了考试。现在想来还是好可惜啊,按照这个思路在考试还剩2.5h的情况下至少能多拿链+菊花图的50pts吧(一开始试验了链的代码只有1.5k,菊花图应该更好写)。之前考场的心态一直不太对,总想着能拿多少分,会不会被别人区分掉。其实真正的目标应该考出自己应有的实力,不要留下遗憾吧。这样就算没考好,也能够问心无愧地说一句技不如人,而不是重新审视这场考试再来后悔莫及。
希望省选,不要带着遗憾退役,毕竟OI生涯至今并没有任何一场自己满意的考试(也没考过几次就是了)。
正话:
显然按位考虑每个数,尽量使它放到编号最小的点上。问题在于如何判断一个数是否可以从号点出发恰好走到号点:将这个转化到边的排列顺序的限制上(因为限制就在于每条边恰好用一次),画图可知等价于对于经过的一系列边,每相邻两条在相交的点的所有边中的顺序是相邻的,且在上的边一定是u的边中最先取的,同理在v的是最后,容易感性认知 证明其充分必要性。
于是用标记数组存每条边在两个端点上是否有相邻的限制。同时,在一个点的连边中的相邻限制关系还不能构成环,用并查集维护一下即可。特殊地,还要考虑一个点的一条边是最先/最后取的情况,如果最先和最后取的边在同一并查集上,那么这个并查集必须包含这个点的所有边。直接做是的,预处理当前的点能到达哪些节点,即可做到。
(我是真的弱智吧,考场上怎么能没有想法啊???)