CSP-S2019 题解
做了这套题,如果是让现在的我当时去考的话应该一共可以有 450 分,格雷码,括号树,树的重心都可以做,树上的数可以有 10 分,Emiya 至少可以有 76 分, 划分也可以有 64 分。看 OIerDB 上可以有 166 名的好成绩。
我的代码合集:洛谷 / 云剪贴板
[CSP-S2019] 格雷码
首先是格雷码有一个很好的生成方式,最低位 的循环,次高位 的循环……
也就是说第 位由 个 , 个 ,再来 个 来循环,并且这与总共有多少位是没有关系的!
那么我们就可以利用这个方法生成给定的第 个数,输出前 位即可。
[CSP-S2019] 括号树
首先我们考虑只有一条链怎么做。
将 ()
看作 ,做出前缀和序列。
那么对于每一个区间 ,为合法括号序列当且仅当 并且 。
于是可以利用单调栈,对于每一个右端点找到满足第二个条件的区间(也就是在前面第一个 后的左端点都满足第二个条件),顺便记录一下与栈顶相等的数的个数即可。
如果放在树上,我们只需要一个支持撤销的栈即可。
[CSP-S2019] 树上的数
抽象题,我只会 和菊花图的做法 QwQ
[CSP-S2019] Emiya 家今天的饭
首先有一个很 naive
的 DP,稍稍卡常应该是完全可以过的。
具体来说,我们发现之多只有一个不满足 的食材,那么我们枚举这个食材是什么即可。
接下来,我们设 表示对于这个食材,考虑了前 种烹饪方法,选择了 种这个食材,一共选择了 种。那么枚举这一次的选择就可以转移了。
令 表示第 种烹饪方式有多少种选择,即 ,如果当前食材为 ,那么转移为:
最后我们只需要 即可。
然而这极度不优秀,将 转化为 ,那么我们只需要 即可,也就是我们只关注 与 的差值,那么我们按照这个作为 DP 对象即可。
这就是 的了,可以过。
[CSP-S2019] 划分
首先, 的 DP 是简单的,我们只需要记录 表示最小代价, 表示使得为最小代价最后一段的最小值。
然而我们需要 QwQ,于是考虑 ,也就是我们需要使得划分出的段最多,那么只需要利用一个单调队列即可。
具体来说,我们需要找到 的最大的 ,也就是 的 即可,由于 是单调的,这容易利用单调队列维护。
[CSP-S2019] 树的重心
见我的另一篇文章:[CSP-S2019] 树的重心 题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App