Luogu10222 [省选联考 2024] 最长待机
题意:一个 Sleep++ 程序由
- 若
,令 ; 若 ,输入变量 。(每次调用都重新输入) - 若
为空:等待 秒。 若 不为空:重复以下操作 次: - 按顺序调用函数
。(设 的长度为 )
- 按顺序调用函数
保证调用关系构成一棵有根树。
我们认为除了“等待
可以证明,调用任意一个 Sleep++ 程序的任意一个函数,无论如何设定输入,消耗的时间总是有限的。
“最长待机”的游戏规则如下:
小
和 小 准备好各自的 Sleep++ 程序并选择各自程序中的一个函数。它们互相知晓对方程序的结构以及选择的函数。 在时刻
,小 和 小 同时调用自己选择的函数,游戏开始。 在时刻
( ),双方可以看到对方在时刻 输入的所有数字,并相应调整自己在时刻 输入的数字,但双方无法得知对方在时刻 输入的数字。 函数调用先结束的一方输掉游戏,另一方胜利。两个调用同时结束算作平局。
小
小
- 操作一:给出
,将 修改为 ; - 操作二:给出
,与小 玩一局“最长待机”,开始时小 会调用自己的函数 。
小
可以证明,小
分析性质
为了直观,将函数抽象成节点,程序抽象成有根树。
- 对于两棵树
,若 存在必胜策略,则记 ( 强于 ),若 存在必胜策略,则记 ( 弱于 ),若双方都不存在必胜策略,则记 ( 与 相平)。特殊地,若双方结构完全一致,则记 ( 与 全等)。
显然,等式和不等式的传递性都成立。等号“
- 引理 1:若某一方必胜,假定对方在时刻
时能观测自己在时刻 时的决策再行动,仍然必胜。(即相同时刻,允许对方后手决策)
证明:略。
- 引理 2:如果将某个子树换成不弱于它的树,整个结构不会变弱。
证明:记被替换的子树根为
考虑
推论:删除一个子树,结构不会变强。
分析性质 - 全黑点的情况
- 引理 3:比较两个纯黑链时,长者严格更强。
证明:略。(考虑用长链构造两个短链,第一个用于等待一秒,第二个模仿对方)
- 引理 4:如果某个黑点的儿子都全等,只保留一个,新结构与原结构相平。
证明:记该节点为
再根据引理2,化简后不强于化简前,于是相平。
- 引理 5:纯黑树相平于一条黑链,链长为树的最大深度。
证明:从深到浅,将每个点的较差儿子们都换为最强儿子,使得每个儿子全等,然后由引理 3 只保留一个。这样操作最终得到一条链。
显然,这些操作不会使最大深度增加。且原结构显然不弱于深度相同的链(故强于深度更小的所有链),故最终得到的就是深度相同的链。
分析性质 - 一般情况
引理 6:若白点有父亲有儿子,等价于直接将它删除,并将它的儿子接给父亲。(显然)
定理:若根是黑点,整棵树相平于一条黑链,链长为“从根出发的路径的最大黑点数”。且这是能化简到的最小点数。
证明:首先用引理 6
删除所有非叶白点,注意到单个白点弱于单个黑点,由引理 5 即得。再由引理 3
容易证明这是最小点数。
根是黑点的情况已经解决。对于根是白点的情况,利用引理 6
与其推论进行化简,最终得到只有根是白色,子孙是若干黑链(或单个白叶子,视为“长度为
- 引理 7:“扫把”
的一个黑链长度为 ,它后面的黑链长度为 ,且 ,将 删除得到“扫把” ,则 相平。
证明:根据引理 2,
推论:“扫把”可以只保留黑链长度的前缀最大值。
根据上述引理,我们可以将任意一棵树化简为黑链长度单调不降的扫把。
- 定理:化简后不同的结构不相平,具体地,后缀字典序更大者强。
证明:设
特殊地,若
显然,化简后的结构点数是最小的。
推论:从最开始调用的点开始搜索出一个白连通块,将这个连通块的直接子树按照
dfs 序从左到右排列为
特殊地,单个白点虽然记为
数据结构维护
先写出朴素 DP。
- 记
为 子树“从根出发的路径的最大黑点数” - 定义序列
:从 搜索出一个白连通块(可能为空),将这个连通块的直接儿子按照 dfs 序从左到右排列为 ,则 。
询问点时, 的和即为答案。
下面考虑转移。
- 若
是白点:将各个儿子的 相接,取出所有前缀最大值,即为 。 - 若
是黑点: 。
接下来用数据结构维护。
首先由引理 6,可以新建
将树重链剖分,然后考虑每条重链,将轻儿子的共线视为定值,将转移写成有结合律的形式,DDP 维护即可。
然而,序列
用全局平衡二叉树维护,操作时涉及到的点个数为
注:类似楼房重建,存在 poly log 做法,但在效率和实现难度上似乎不如根号。