CF1990 比赛记录
Halberd Cease

比赛链接

A

搞笑题,但是笔者赛时桶不清空,爆罚一发,笔者更搞笑。

简要题意

给出 个数 ,有一个初始值为 的变量 ,两个人轮流执行以下操作:

  • 选择一个 ,然后令 ,再令

无法执行操作的人输掉,问先手是否有必胜策略。

思路

结论 1:若所有数是偶数,则先手必败。

证明 1:后手只需要和先手取同一个数,因为所有数的个数是偶数,所以后手一定可以取到,就一定可以获胜。

结论:只要 中有出现次数为奇数的数,则先手必胜,否则后手必胜。

证明:先手取最大的出现次数是奇数的数,因为无法取 的数,因此场上剩下的能取的数都有偶数个,由结论 1 得这是一个必败局面,由后手操作,因此后手必败。所以先手必胜。

B

简要题意

nm 构史题面叫我怎么简要?

一个长度为 的数组 ,有如下定义:

  • 数组 的最大前缀位置(MPP)为满足 的最小的
  • 数组 的最大后缀位置(MSP)为满足 的最大的

给出 个整数 ,你需要构造一个满足以下条件的数组

  • 大小为
  • 每个元素为
  • 的 MPP 为 ,MSP 为

保证

思路

直接说做法,读者感性理解。

首先 都应该是 ,然后由 往后遍历,,以此类推。

同理, 往前遍历,,以此类推。

中间的值包括 全部是

这样构造可以满足所有 的情况。

笔者赛时没有看到 虚空分类讨论,30 分钟才过这道题,笔者更搞笑。

C

简要题意

定义一个数组的 MAD 为这个数组中至少出现两次的最大数,如果没有的话,则 MAD 为

重复执行以下操作,直到数组 中的所有数都为

  • 建立一个大小和 相同的数组 ,将每一个 设置为数组 的 MAD,然后令

求出 的值(最初为 )。

思路

考虑手动模拟几组数据:

,一次操作过后

继续模拟,发现 数组变化很有规律:

像是整体在往右移动,我们再来手模一组:

,变化如下:

上面的结论好像在第二步的时候失效了,但是通过第六感我们知道这个结论一定有用,于是我们来分析一下它的具体情况。

首先,第一次操作后生成的 数组,一定是单调不降的,这个显然。

然后我们分析一个单调不降的数组,将求 MAD 的过程看作往里面加数的过程,如果要使 MAD 更新成另一个大的数,因为数组单调不降,所以当前数必须出现至少两次。这样子我们得到的数组除了最大的一个数,其余每个数都至少出现了两次,并且整个数组单调不降。

然后手动推一下,发现这种数组符合之前发现的每次操作使数组整体右移一位的规律。正确性显然,因为除了最后一个数,每个数都有至少两个,因此不会被一回合操作吞掉,因为单调不减,所以这部分数 在新数组的位置是从 起(因为有两个当前数)到 止(因为 时下一个数已经有两个了)。

因此,直接暴力进行前两次操作,然后计数统计后面的贡献即可。

D

简要题意

有一个 的 01 矩阵,对于矩阵的某一行,存在一个整数 使得:

  • 行的前 个数是 ,其余数是

有两种操作:

  • 将一个 的矩阵全部变成
  • 将一行的数全部变成

求将整个矩阵变成 的最小次数。

思路

显然,如果一行满足 ,直接消去这一行不劣。

否则我们分情况讨论:

  • :这时如果上面一行采用 染色方案,将这一行第 列染成 ,就不管,否则将这一行和下一行的第 列染成 ,标记下一行第 列然后答案
  • :如果这一行的 列都被标记,那么不管,但是这是不可能的,后面会详细说原因;如果只有 列被标记,那么将这一行与下一行的 列染色,答案 ;如果是 列被标记同理,将 列染色;如果一行都没有被标记,那么直接染色一整行显然不劣,因为如果下面一列大于 个或者一个都没有,这种做法会比只染当前一行浪费一次操作,而其余的情况可以通过染色下一行一次来达成,因此直接染色一行不劣。

直接模拟即可。

E

后面找时间补。