CF1322
Codeforces Round #626 (Div. 1, based on Moscow Open Olympiad in Informatics)
1|0A
设 为前缀左括号个数减右括号个数,每一段 的区间都需要操作,操作还需包含一段负区间末尾 的位置。
2|0B
考虑第 位,将所有数在模 意义下考虑,若两个数的和 ,则其在第 位为 ,通过双指针统计个数,按奇偶性计算即可。
3|0C
设 为右部图的点 在左部图的与其相连的点集,给每个点集 初始权值为 。将相同的点集进行合并,合并后的权值为相同的点集权值和。最终答案为所有剩余点集权值的 ,这里不考虑空集。
4|0D
先将序列翻转,将单调不升变为单调不降。设 为考虑了攻击力 的选手,且攻击力为 的选手有 个的最大收益,得转移为:
这样转移就能保证单调不降了。这里对 的枚举范围进行限制,当前攻击力为 时,对于 枚举前 项,对于 枚举前 项,对于 枚举前 项, ,这里相当于模拟了所有攻击值的二进制加法,因为对于每个 ,其有效的状态数为 ,所以复杂度为 。
5|0E
先考虑 序列,发现 和 都是稳定的,因此只需处理 交替的段。考虑枚举一个分界线 ,将 的位置都看作 ,所有 的位置都看作 ,若位置 在 表示下的最终结果为 ,则位置 最终的值 ,否则 。得当分界线从 枚举到 时,位置 的结果从 变成了 ,则位置 最终的值为 。
所有分界线得出的序列中 交替的段的最长长度除以 为操作次数,因为每次操作后 交替的段的长度会减少 。
考虑求出每个位置向两边扩展 交替的段的最长长度,根据该长度分类讨论即可得出当前位置的最终的值。可以通过 表预处理最值,然后二分求解最长长度。
6|0F
不难发现答案上界为 ,其可以通过数学归纳法证明,去掉一个叶子就为一棵 个点的树,该叶子要么最小,要么最大。
先考虑判定无解的情况。先将树定为有根树,考虑树上的一条边 ,若其没有被路径覆盖,则可以不考虑这条边,若其被覆盖了,那么该边一定满足这两种状态之一:。
一条路径就是使若干边的状态相同或者相反,那么可以用并查集来判定是否有解。
发现答案具有单调性,可以二分求解,考虑用树形 来判定二分。当前二分的值为 ,设 为边 为状态一时 的最小值,不难发现当边 为状态二时 的最大值为 ,将 子树内值域取反即可。
考虑 的子树 对 的限制:
若 没被覆盖,则不考虑。
若覆盖 和覆盖 的路径有交,即 和 的状态有关联,那么已知 为状态一时,就能确定 的状态了。 为状态一时,得 ,得其对 的限制区间为 , 为状态二时,得 ,得其对 的限制区间为 。
若覆盖 和覆盖 的路径无交,则 子树内的状态选择和 的状态无关,考虑 子树内的状态的某种选择对 的限制区间为 ,得另一种状态对 的限制区间为 ,得 子树对 的限制区间为 。
那么将 的所有子树对 的限制区间取交,限制下的集合最小值即为 。发现 不一定是一段连续的区间,因此要用线段树扫描线来维护。
实际上可以更简便,发现若 不是一个连续的区间,则其一定是两个以 为对称轴的区间,那么可以维护中间空出的部分一定包含 。因此维护区间的交和中间空出的部分的并即可线性转移。
构造方案时,可以在树上差分打标记,若边 为状态二,则将子树取反。
(这题代码在有了)
__EOF__

本文链接:https://www.cnblogs.com/lhm-/p/13845757.html
关于博主:sjzez 的一名 OI 学生
版权声明:转载标明出处
声援博主:希望得到宝贵的建议
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现