Codeforces Round 960 (Div.2)

A

非常容易观察到性质,注意 Alice 为先手,发现当 amax 的个数为奇数时显然能 win,但如果 amax 的个数为偶数且有一个数具有奇数个可以作为跳板,那么也能 win,否则就 lose。

B

结论:presumx2+presumy12+minpresumi1+maxpresumi,后缀和同理。

C

模拟一下容易发现每次操作后整个数组都会向后移动。

我们首先对数组进行一次操作模拟,发现整个数组就变成单调不降的了。

之后我们开始观察,对于一个连续的序列 a[l,r]=x(l<r,x>0),在一次运算之后,得到一个新的限制 a[l+1,min(r+1,n)]=x 成立,然后再给结论:如果数组中所有非零连续段(出去最后一段)的长度都大于 1,那么数组就遵循一个 “右移” 定律。

对于 “右移” 数组,不难得到 bi<bi+1<bi+2,可以推断出 bi=ai,bi+1=ai+1,并且至少有 aj=ai+1(ji) 成立,这也就说明 a 并不是非单调递减的,也就是说经过 2 次运算总能得到一个 “右移” 数组。

D

考虑贪心,对于 ai 足够大的情况,我们一定会在 i-th 行上使用操作 2,具体的 i 是多少呢?

对于 ai5 的情况直接使用操作 2 即可,因为至少需要 32×2 的网格来覆盖,而在 i1,i,i+1 行进行三次 2 操作带来的收益显然更大。

然后讨论一下 ai<5 的情况,考虑从左到右:

  • 没有黑色格子
  • 2 个黑色格子,放入一个 2×2 的子网格
  • >2 个黑色格子,直接进行一次 2 操作即可

总结一下,对于 i-th 行,对于当前行来说 i1-th 的影响只有:

  • 不受影响
  • 3 列和第 4 列的单元格被涂成白色
  • 1 列和第 2 列的单元格被涂成白色

E

交互题。

当我们查询子树的时候,如果返回 0,那么删除整棵子树。注意到我们可以查询任意叶子节点,那么如果返回了 1 就直接跳出,否则鼹鼠就要往父节点跑,再考虑如果查询子树时返回了 1,那么就再查询将其驱逐出当前的子树跳往父亲。

朴素的做法处理起来太麻烦,而且 Easy & Hard 还需要做优化,官方的题解给的做法太麻烦了,给一个更优的解法:

查询任意的叶子节点 70 次(均摊),然后删除 depmaxdepv+170,那么树就被拆分成了 70 条链,check 一遍跑过去就可以了,这样跑得飞快。

F

无端联想 % 你赛的最大 C,主席树挂大分……

非常明显需要使用线段树维护,明确我们需要做什么.

注意到对于一份 “局部” 的最大多边形线段 [l,r] 必须满足 minal1,ar+12(al++ar),当然包括 l=1,r=n 的情况。

当且仅当 i=1rai2ai 时,定义区间 [l,r] 的后缀 [i,r] 为 special,同样的前缀也定义为 special。

观察性质,最多有 O(log(maxa)) 个 special 后缀,因为从定义中不难得到一个 special 之和至少是前一个 special 之和的 2 倍,因此我们可以合并左边区间的 special 后缀和右边区间的 special 前缀,这部分可以使用 two-pointers 来完成,然后就可以获取到一个跨越区间的答案了。

posted @   起汐  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示