2022 牛客多校 第七场 题解
C题 Constructive Problems Never Die(思维,构造)
大胆猜结论:除了所有元素相同的情况,否则一定存在一组解(实际上也确实是的)。
这题似乎解法特别多,这里贡献一下我们的做法:
- 按照顺序,统计一下不可以填 1 的位置的集合 ,不可以填 2 的位置的集合 ,一直到 ,外加一个空的
- 维护一个包含 1-n 内所有数的集合
- 先检查
- 如果空,则跳过
- 如果非空,那么
- 从后面非空集合中随便选出一个位置,填上 1,并从 中删除 1
- 现在 内的所有位置都是可选的了,将他们都放入
- 一直重复该流程,直到
- 现在将 内元素随机分给 里面的位置即可
这种方式,每填一个数,就让限制值的位置减少了至少一个,所以是一定有解的(所有元素相同除外,因为根本填不了)
如果愿意,其实是可以优化的(例如优先选 大的),不过没必要,因为是签到(bushi
F题 Candies(思维,deque)
额,能够删除的情况一共只有四种:。
那么我们尝试将所有大于 的数都变成 ,那么我们就可以完全消去操作 2,就变成了一个环上面玩消消乐的流程了(直接 deque 模拟,先消中间的,再消两端的)。
G题 Regular Expression(思维)
对于任意字符串,都可以使用 来匹配,那么最小长度的最大值就一定是 2。
-
,此时只有两种匹配: 和
-
- 型字符串,样例给出了答案,即六种:
- 型字符串还多了两种:
-
此时如果并非所有字符相同,那么仅剩 两种,否则还有 两种
(附:上面的括号啥的仅作分隔用途,不属于正则的一部分)
J题 Melborp Elcissalc(前缀和,组合,DP)
给定数字 ,问有多少长度为 的数列,满足:
- 每个数都在 内
- 恰好有 个子区间,区间和是 的倍数
区间和的统计,不妨通过前缀和的方式转成单点查询,构造前缀和数组 (同时还要对 取模),区间 的和是 的倍数就意味着 。同时,因为元素范围限制,一个前缀和数组恰好对应一个原数组。现在问题转化为了,有多少长度为 的数组 (,别的位随机),能够从中找出恰好 对相同的元素?
注意到填的数字的具体位置不影响对数,只影响方案,那么我们可以考虑枚举 分别出现了几次,通过这个来判断对数,然后再具体看能构成多少方案。
(为了方便,原题中的 ,我们使用 来代替)定义 为已经填到了 ,这些数总计 个(例如填了 3 个 0,4 个 1,2 个 2,那么 ),一共贡献了 对,此时的方案数,那么最终答案是 。
似乎大家基于此得到的 DP 方程各有所不同(正推反推,集中填还是随机填啥的),我的 DP 方程如下:
当前为 ,那么我们可以枚举用了 个 ,那么之前的数就还有 个,意味着现在有 个空位,那么我们直接在这些空位上选 个位置,也就是 。 个数可以贡献 对,所以我们从 转移过来,方程为:
对于 的地方要额外注意一下,一个是因为 DP 边界条件的原因,还有就是因为维护的是一个前缀和数组的计数 DP,别忘了 这玩意。
本题复杂度上限是 ,也就是 这样,不过跑的不是很满,加一下优化啥的就能过了。
K题 Great Party(博弈)
给定 堆石子,第 堆的石子的个数为 。
Alice 和 Bob 两个人轮番进行操作,操作选手可以选定某一堆石子,从中拿走一些石子,并可以选择将剩下来的石子合并到另一堆中,最终无法操作者判负。
有多次询问,每次询问中需要求出区间 有多少子区间是先手必胜的。
区间长度为 1,先手必胜(全拿走就行了)。
区间长度为 2,如果两堆石子数量相同,则先手必败。(Alice 选择某一堆拿走 x 个,Bob 则选取另一堆也拿走同样个数,又回到了两队石子相同的情况,以此类推)。同理,两队石子数量不同时则先手必胜。当然,也可以理解为,没有人会手动使得状态回到只剩一堆的情况。
区间长度为 3 时,先手必胜(三个相同或者有两个相同的情况下,一定能先手使得其变为必败态;三个互不相同时(例如 ),直接把 拿到 个,然后合并一下)。
区间长度为 4 时,没有人想要让区间回到长度为 3 的状态,也就是最后必然会达到 的状态,面临该状态者必败,而这可以理解为 玩一个 nim 游戏。
接下来,可以找到的题解都没有给出过多解释,只提出了一个结论:区间长度为奇数时,先手必胜(把最多的那一堆拿掉一部分,然后剩下来的合并到另外一堆里面);同时,也得到了偶数时候的策略:集体减 1 的 nim 游戏。
我有一个不太成熟的,关于区间长度是奇数时候的思路:假设以长度为 5 为例,且已经都减去了 1,那么按照大小顺序从小到大排列,为 ,那么我们可以消去 ,并给前面某个数加上 间的所有数。我们令 ,记 的最高是 1 的位为 ,那么至少有一个数的这一位不是 ,我们假设就是 吧,那么显然就有 ,那么我们只需要给 加上 ,就能使得剩下来的数的异或和是 0 了。虽然不会严格证明,但我凭直觉认为 。
综上,我们得到的游戏策略如下:
- 区间长度为奇数时,先手必胜
- 区间长度为偶数时,对区间内所有元素减去 1 后异或,和大于 0 说明显示必胜,反之先手必败
对于查询,考虑到这是离线不带修的,而且似乎也可以 的扩展边界,所以可以莫队搞一手。
(技巧:我们查询的是有多少子区间代表的是胜利,那么我们直接用总区间数量减去负的,一段区间 为负,意味着 ,那么我们就对于一组查询 变为 ,这样就可以变成查询区间里面类似 的数量了)
__EOF__

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