题解 P7595 【猜树】&& P7597 【「EZEC-8」猜树 加强版】(交互,构造,dsu on tree)
原题
交互题?可以乱搞,有意思
首先分别考虑只用一种询问的做法。
subtask1+2+3(?)+5
考虑询问 ,把每个节点的子树都搞下来,开这样几个东西:
- 表示当前节点 子树的大小。
- 这是一个 vector 或二维数组 ,表示节点 所有的祖先(不需要按顺序)
这两个都可以在询问子树的时候求出来,具体做法不细讲。
然后是类似拓扑排序的思想:将所有节点按 由小到大排序,前面的若干个 一定是 ,即这些节点是叶子节点。这样从前到后处理,一定是按照从叶子节点向上处理的顺序。
处理到叶子节点 时,把 删除,按照 把 的祖先的 全减一,找到祖先中 最小的节点 ,则 。因为如果 的祖先 不是 的父亲的话,那么 真正的父亲 的子树则一定是 的子树的子集,所以 。
这样不断向后处理,处理到 时, 也一定等于 ,因为它的子树已经在先前的处理中删掉了。
为什么?可以自己试着画图推一下,其实非常好理解,这里直接放一下代码:
时间复杂度和询问次数?这里的复杂度和子树大小递减的速度有关,同一层的节点越多,复杂度就越低,比如完全二叉树时,时间复杂度和询问次数为 ,反之,如果为链,每次子树只递减 ,那么时间复杂度和询问次数约为 。数据随机的情况为 。(prufer 序列生成的真随机,下文亦同)
期望得分
subtask1+2+3+4
考虑询问 。
开这样几个东西:
- 表示节点 的深度(定义根节点深度为 )
- 没了
当 且 时,。
(这不用我解释吧……)
那么思路就很明了了,首先询问 到其它节点的距离得出 ,然后每次把已经知道父亲的节点入队(若 则 )。对于对头的节点 ,询问每个 的 节点,若 为 ,则令 ,并把 入队。
代码:
时间复杂度和询问次数?因为这题对时间复杂度的要求不高,这里窝偷了个懒,时间复杂度是稳定的 ,但其实可以做到和询问次数同阶的。询问次数则与每一次的节点个数有关,询问次数的总数大约是 。如果是链,询问次数达到最优的 ,如果每次的节点很多,如完全二叉树,那么询问次数将会退化到 以上。随机数据的询问次数也是 左右。
期望得分
接下来是乱搞环节,我们发现 相对于 来说非常小,考虑一些不太正经的解法。
可以按照当前深度的节点数 进行分治,如果大于阈值 ,跑第一种,反之跑第二种,时间复杂度是 。这是一个显然的根号分治, 取 时候达到最优的 ,不过这里的不再是随机数据,针对所有数据都可以做到复杂度不退化。
期望得分 。
但还有另一种简单粗暴的写法,不如根号分治优,就是直接判断整颗树的深度,取一个阈值 ,深的话跑第二种,浅的话跑第一种,即数据分治(
我也不知道 取多少最好。这样的复杂只是度是比单独的两种好,但还是可以被卡掉,但是这题数据水,这样写就能过了。
期望得分 。
代码:
加强版
如果你直接把 P7595 的代码往这里一粘,你就可以获得 pts 的优秀分数
此做法来自月赛讲评。
看这题的数据,显然是需要一个 的做法。
考虑一个 simple idea:如果 且 在 的子树中,那么 。
那么就有一个显然的做法: 次询问把 搞出来,然后从根节点向下递归处理每个节点,对于每个节点询问一次子树,这样做询问的量级在 左右(连弱化版都过不了)。
如何改进?对于 节点,确定一个儿子 。知道了 节点的子树,又知道了 其它儿子的子树,两者相减就可以得到 的子树。这样做,每次可以省去一个儿子的子树的询问。
那么 应该选哪个呢?显然应该选重儿子,在考虑树剖和 dsu on tree 里的推论,可以得到 的量级在 (证明可以去看 oiwiki),完全二叉树时达到下界。那么如果能够知道每个节点的重儿子,那么就可以在 内解决这个问题。
如何在一颗结构不明的树里找到每个节点的重儿子?随机的艺术。
我们随机一些点,根据定义,重儿子的子树最大,那么应该占随机出的点就应该更多。那么我们就把占随机点最多的儿子当成重儿子。
那么应该随机几个呢?通过实验发现,随机 个表现十分优秀。
为什么?随机的艺术。
复杂度的退化主要来自与处理时把重儿子和轻儿子颠倒了,如果出题人想卡这样的做法,就必须将重儿子搞得尽量重,但随即 也会更小,所以实际表现也十分优秀。
代码:( 表示重儿子, 表示子树大小, 表示子树)
__EOF__

本文链接:https://www.cnblogs.com/tiatto/p/15875606.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?