CF1358 简要题解

咕咕咕,昨晚忘记打了,因此被 D 了一顿(

Good problems, pathetic memes.

  • A

显然放一个灯泡点亮两个格子,等价于用可重叠的骨牌覆盖黑白棋盘。因此答案就是 \(\lceil\frac{nm}{2}\rceil\)

  • B

由于同时邀请多个人的时候,她们之间会互相看到,因此分成多次邀请一定不如一次性把所有人都邀请来优(先被邀请到的人不能看到后被邀请的人)。

于是只需要考虑最多能邀请多少人即可。显然,按照 \(a_i\) 排序后,如果后面的人能被邀请,那么前面的人也可以。因此,能邀请的最后一个人是最大的 \(i, a_i\leq i\)

  • C

计算本质不同的结果数,有 arc 内味了(

由于对于任意的 \(y>1\),有 \(f_{x+1, y-1}=f_{x, y}+1\),因此对于一条 \((x_1, y_1)\rightarrow (x_2, y_2)\) 的路径,假如它不是 L 形,即先一直向下,再一直向右的情况,那么将任意一组 \(x\ne x_2, (x, y)\rightarrow(x, y+1)\rightarrow(x+1, y+1)\) 的操作变成 \((x, y)\rightarrow(x+1, y)\rightarrow(x+1,y+1)\),必然会让路径的权值和恰好增大 \(1\);反过来同理。可以证明,除了 L 形之外,所有路径都至少存在这样的一个操作。因此,在路径的权值和从最小向最大变化时,中间的每一个值都可以取到;并且 \((x_1, y_1)\rightarrow (x_2, y_1)\rightarrow(x_2, y_2)\) 必然是最大的路径,\((x_1, y_1)\rightarrow (x_1, y_2)\rightarrow(x_2, y_2)\) 必然是最小的路径。

考虑如何计算这两条路径的权值差。实际上不难发现,我们并不需要计算出每个位置的值或某条路径的权值和,只需要比较每一对对应的位置,对这一对位置的差求和即可。由于每一对位置都恰好在同一条反对角线上,它们的差随着路径延伸,是一个先增大,持续一段时间,再缩小的过程。分别算一下即可。

  • D

可以发现,结束的时间点必然是某个月的月末。

设持续的区间为 \([l, r], r=l+x-1\),考虑 \(r\) 所在的月份 \(i\),如果 \(r\) 没有卡在第 \(i\) 个月的月末的话,比较 \(l\)\(r+1\) 在当月中天数的大小 \(p_l, p_{r+1}\)。如果 \(p_l>p_{r+1}\),那么直接将整体向左移更优,直到 \(r\) 成为第 \(i-1\pmod n\) 个月的月末为止。由于 \(p_l>p_{r+1}\),这样移动一定可以移到某个月末。否则,类似地,直接将整体向右移到第 \(i\) 个月的月末,答案也不会变差。

因此,只需要考虑 \(r\) 在每个月的月末的情况,双指针维护 \(l\) 所在的月份和天数即可。跨年的情况可以将月份数组直接复制一份接在后面。

  • E

很有趣的题目,但是边界之类的细节略多,写起来很头疼(

首先是一个很好证明,却没那么容易得到的观察:假如某个 \(k\in [1, \lfloor\frac{n}{2}\rfloor]\) 满足条件,那么任意整数 \(x>1, xk\leq n\),对应的 \(xk\) 都满足条件。证明只需要考虑将首尾相邻的 \(x\) 个区间拼起来即可,由于每个部分都有 \(\sum_{i=l}^{l+k-1} a_i>0\),显然拼起来之后也 \(>0\)

因此,我们只需要考虑 \(k\in [\lfloor\frac{n}{2}\rfloor+1, n]\) 的即可。注意到这些 \(k\) 都满足,任意一个长度为 \(k\) 的子区间 \([r-k+1, r]\),都满足 \(r+1\) 在 “the same” 范围内。换句话说,对于每个左端点,它对 \(k\) 的限制都形如 \(c+kx >0\)\(k\geq b\)(即这个左端点对应的子区间右端点超过了 \(n\),它自然就不存在了)。

\(x\geq 0\)\(x<0\) 讨论一下,第一种情况实际上只需要判断 \(\sum_{i=1}^n a_i>0\) 是否成立即可(因为在 \(k\) 尽量大时,一定能满足更多的限制)。

否则,每个限制都可以解出 \(k\leq a\)\(k\geq b\),只需要将 \((a, b)\) 这个区间内打上标记,最后判断 \([\lfloor\frac{n}{2}\rfloor+1, n]\) 内有没有不带标记的位置即可。边界和细节比较多,需要仔细判断。

  • F

一个关键的观察是,从 \(b\) 逆着还原 \(a\) 时,设 \(R(b)\) 表示 \(b\) 翻转后的结果,如果当前的 \(b\ne a\)\(R(b)\ne a\),那么它至少还要经过一次 \(P\) 操作,因此此时的 \(b\) 必然是单调增或单调减的。

因此,只要它仍然是严格单调的,就可以直接模拟从 \(b\)\(R(b)\) 还原 \(a\) 的过程。对于一个 \(a\rightarrow b\) 的过程,考虑所有可能性中值最小的一个,即初始全为 \(1\),每次只执行 \(P\) 操作,发现 \(a_n\)\(m\) 次操作后会变为 \(\binom{n+m-1}{n}\)。换句话说,\(\max a_i\) 的增长速度是以 \(n-1\) 为底,关于 \(m\) 的指数级的。只要 \(n>2\),直接模拟就跑得飞快。

对于 \(n=1\) 的情况,有解当且仅当 \(a=b\)

对于 \(n=2\) 的情况,如果 \(a=\{1, 1\}\)\(b=\{1, 10^{12}\}\),直接模拟显然不行。但是注意到,除了最后一段连续的 \(P\) 操作,剩下的都可以用取模代替。

posted @ 2020-05-27 18:15  suwakow  阅读(298)  评论(0编辑  收藏  举报
Live2D