P11234 [CSP-S 2024] 擂台游戏
基于 CSP-S 2025 之前对本题的一些思考,虽然考场上不一定能想出来,但是很具有思考价值(除了题面输入是真的屎)。
首先可以不管 \(c_i\),我们先思考 \(n\) 时的答案是什么,如何计算,再考虑 \(c_i\) 的性质。
具体来说,这是一棵完美二叉树,我们可以先枚举结点,看这个结点是否能成为最后的答案,每次往上跳的过程中,我们可以分情况讨论一下(假设我们目前讨论的是第 \(i\) 个人):
- 到了结点 \(x\),第 \(i\) 个人是擂主,那么我们只需要判断是否能晋级即可(补充选手显然可以晋级)。
- 到了结点 \(x\),第 \(i\) 个人不是擂主,这里稍微复杂一点,首先看当前擂主有没有可能是补充选手,如果没有可能直接判断即可,否则我们初始令 \(x\) 另一棵子树里的补充选手能力值满足每次都能晋级(极大值),如果此时仍然不是补充选手,那么直接判断,否则一定 \(i\) 可以晋级(因为轮数递增,我们将所有人的能力值设为轮数 \(- 1\) 显然能够满足上述条件)。
显然此时单次判断一个人能否晋级是 \(O(\log n)\) 的,我们接下来考虑多个 \(c_i\) 的解法。
相当于每次将一棵靠左的子树拎出来,将其后缀一些选手设为补充选手,做这个过程,你发现不考虑选手类型的话,整个打擂流程相对是不变的,因此我们还是考虑枚举结点完成这个过程。
此时枚举点时,我们先要枚举这个点到底是不是补充选手,重复上述过程,当跳到一个结点 \(u\),如果 \(u\) 到根的路径上一路向左,那此时 \(u\) 就能够对一些 \(c_i\) 产生贡献,可以用数据结构简单维护(注意需要满足贡献到的 \(c_i\) 能使 \(i\) 不为补充选手/为补充选手),不难发现这个过程是有单调性的(贡献到的 \(c_i\)),简单模拟即可。
到这一步,时间复杂度为 \(O(T(m + n \log n))\),我们需要追求极致的 \(O(T(m + n))\) 做法。
补坑qwq。

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号