【做题记录】Codeforces Round 915 (Div. 2)/CF1905A-F
@
A. Constructive Problems(800)
注意到,对于
推广到
B. Begginer's Zelda(1100)
考虑每次合并一对叶子节点,只剩一个时和根节点合并,这样次数最小。
随便口糊一下证明:因为每一个叶子结点都要合并,那肯定是跟其他叶子结点合并最优。
C. Largest Subsequence(1400)
考虑最终情况,即将典序最大的子序列变成 从小到大 的再插回原序列中,即可判断是否有解和次数。
Tips:
找典序最大的子序列 可以从后往前,没找到一个比自己大的就直接替换,可以证明是对的。
D. Cyclic MEX(2000)
考虑模拟每一次操作。
先求出前缀 mex,则每把一个数
注意需要维护权值跟出现次数两个东西。
E. One-X(2400)
正难则反,考虑计算每一个节点作为 lca 被计算了多少次。
设节点
若
又发现对于不同的点
于是正解来了:
考虑直接记忆化搜索。
令
得出转移公式:
若
其中
为什么呢?
回到建树过程:
void buuild(int x,int l,int r){
//
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
}
就是这两行,懂?
于是我们就可以欢乐记忆化暴搜了。
对了,忘记证明时间复杂度了,关键是 线段树上长度不同的区间个数是
F. Field Should Not Be Empty(2600)
这里用
观察到一个数是好的,当且仅当
瞪眼法可知,我们只会换逆序对,除非没有(所以要特判),因为这样原来是好的还是好的,原来不好的有可能变为好的,可证明是最优的。
那我们考虑对于一个不好的点,记录那些操作能把它编号,最终我们取最大的即可。
考虑分类讨论:
-
,则能把 从不好变为好 当且仅当只有一个 ,使得 ,则调换一下 和 后面那个小于 的即可。 -
此时只有可能把 和 位置调换才有可能,判断一下即可。(这里不详说,留给读者仔细思考) -
同上
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App