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\) 操作,剩下的都可以用取模代替。