Codeforces Round 960 (Div.2)
A
非常容易观察到性质,注意 Alice 为先手,发现当 的个数为奇数时显然能 win,但如果 的个数为偶数且有一个数具有奇数个可以作为跳板,那么也能 win,否则就 lose。
B
结论:,后缀和同理。
C
模拟一下容易发现每次操作后整个数组都会向后移动。
我们首先对数组进行一次操作模拟,发现整个数组就变成单调不降的了。
之后我们开始观察,对于一个连续的序列 ,在一次运算之后,得到一个新的限制 成立,然后再给结论:如果数组中所有非零连续段(出去最后一段)的长度都大于 ,那么数组就遵循一个 “右移” 定律。
对于 “右移” 数组,不难得到 ,可以推断出 ,并且至少有 成立,这也就说明 并不是非单调递减的,也就是说经过 次运算总能得到一个 “右移” 数组。
D
考虑贪心,对于 足够大的情况,我们一定会在 -th 行上使用操作 ,具体的 是多少呢?
对于 的情况直接使用操作 即可,因为至少需要 个 的网格来覆盖,而在 行进行三次 操作带来的收益显然更大。
然后讨论一下 的情况,考虑从左到右:
- 没有黑色格子
- 有 个黑色格子,放入一个 的子网格
- 有 个黑色格子,直接进行一次 操作即可
总结一下,对于 -th 行,对于当前行来说 -th 的影响只有:
- 不受影响
- 第 列和第 列的单元格被涂成白色
- 第 列和第 列的单元格被涂成白色
E
交互题。
当我们查询子树的时候,如果返回 ,那么删除整棵子树。注意到我们可以查询任意叶子节点,那么如果返回了 就直接跳出,否则鼹鼠就要往父节点跑,再考虑如果查询子树时返回了 ,那么就再查询将其驱逐出当前的子树跳往父亲。
朴素的做法处理起来太麻烦,而且 Easy & Hard 还需要做优化,官方的题解给的做法太麻烦了,给一个更优的解法:
查询任意的叶子节点 次(均摊),然后删除 ,那么树就被拆分成了 条链,check 一遍跑过去就可以了,这样跑得飞快。
F
无端联想 % 你赛的最大 ,主席树挂大分……
非常明显需要使用线段树维护,明确我们需要做什么.
注意到对于一份 “局部” 的最大多边形线段 必须满足 ,当然包括 的情况。
当且仅当 时,定义区间 的后缀 为 special,同样的前缀也定义为 special。
观察性质,最多有 个 special 后缀,因为从定义中不难得到一个 special 之和至少是前一个 special 之和的 倍,因此我们可以合并左边区间的 special 后缀和右边区间的 special 前缀,这部分可以使用 two-pointers 来完成,然后就可以获取到一个跨越区间的答案了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】