1 条题解
-
0
自动搬运
来自洛谷,原作者为

Imakf
**搬运于
2025-08-24 22:44:02,当前版本为作者最后更新于2023-02-01 13:53:14,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
咋青山老师的题都没人写题解,伤心了啊。
部分分
先考虑部分分 ,要求操作两次把树还原成一条链。
其实任意链本质上与 (下文称“排好序的链”)没区别,因为可以对编号重新映射。
先考虑什么情况下可以一次操作把把树变成排好序的链。
有一种比较好的情况是:当前树恰好是对序列建立出的大根笛卡尔树,此时由于删去最小值之后,剩余结点最小值依然在叶子位置,所以我们依次连接最小值就可得到所需链。
于是不难发现:只要树满足“删去最小值之后,剩余结点最小值依然在叶子位置”,即可实现一次操作还原成排好序的链。
那么怎么一次操作变成满足这样条件的树呢,那就直接点分治的时候,每次都选子树内权值最大的作为分治中心就行了。
获得 20 分!
正解
考虑怎么做整道题。
先把 变成 的链 , 由某条链 变来其中每一次操作都使最大度数 ,发现要操作 次,非常好。
已经解决 ,考虑怎么解决 。
把过程反过来考虑, 的上一个状态是什么,然后尝试减小 的最大度点的度数。
你发现有一种方法如下:
选 的一个叶子结点为根,然后 dfs 整棵树,如果 的某个孩子 为当前最大度数 ,则删去边 ,再在 子树中随便选一个叶子 ,然后连接 。可以说明 一定存在,因为二度点不需要管,缩完二度点后,显然叶子比其他所有点数量都多。维护子树内的所有叶子可以链表。
注意到我们必须先通过 求出 ,然后再进行 ,所以说要存下中途的操作再逆序输出。
复杂度 。
代码写得比较丑,就不放了。
- 1
信息
- ID
- 8194
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者