[CodeForces] CF404 题解
注:难度评级为 D 到 A,对标 NOIP T1 到 T4。+ 表示比原本难,- 反之。例如,D+ 比 D 难。难度评级仅供参考。 如果认为难度评级与实际难度不符,可以在评论区@我进行讨论。
本篇题解无复杂的公式推导,题目较清新自然,请放心食用。
斜体字为说明提示。通常与多倍经验有关。
A. Valera and X
【难度分析】
思维难度:D-
实现难度:D-
总体难度:D-
评级: 普及-
【题目大意】
判断一个 \(n \times n\) 的字符矩阵 \(A\) 是否合法。称其合法,当且仅当:
- 矩阵两条对角线上的字符都相同。
- 除了两条对角线以外的地方,字符都相同。
- 矩阵不能只由一种字符组成。
合法输出 YES,否则输出 NO。
- \(3 \leq n \leq 300\)。
【解题思路】
注意到 \(3 \leq n \leq 300\),模拟即可。
B. Marathon
题面看不懂,咕了
C. Restore Graph
【难度分析】
思维难度:C
实现难度:D
总体难度:C-
评级: 普及+/提高
【题目大意】
给定 \(n\) 和 \(k\),构造一个无向图,使得从某一点开始到第 \(i\) 个点最短路为 \(d_i\)。
不存在输出 -1。
- \(1 \leq n, k \leq 10 ^ 5\),\(1 \leq d_i < n\),输出的总边数应该不超过 \(10 ^ 6\) 条。
【解题思路】
考虑到构造图较难,我们可以构造树。
根节点可以选 \(d_i\) 为 \(0\) 的点。这样,\(d_i\) 表示的就是每个点到根节点的距离,即深度。
知道深度了,我们只需要上一层的向下一层的连边即可。容易证明这样构造是对的。
不合法情况:
- 不存在 \(d_i\) 为 \(0\) 的点。
- \(d_i = 0\) 的点不止一个。
- 根节点度数 \(\ge k\)。
- 某个节点度数 \(\ge k - 1\)。即设第 \(i\) 层(\(1 \leq i < 最大层数\))点数为 \(a\),第 \(i + 1\) 层点数为 \(b\),有 \(a \times (k - 1) < b\)。
D. Minesweeper 1D
【难度分析】
思维难度:C
实现难度:D-
总体难度:D+
评级: 普及+/提高
【题目大意】
一维扫雷。
给定一个字符串 \(s\),\(s\) 仅由 0、1、2、*、? 组成,它们表示:
0:它的左边和右边都没有雷。1:它的左边和右边有一边有雷。2:它的左边和右边都有雷。*:它是雷。?:它未知。
将 ? 替换为其他的任意一个,求总方案数,对 \(10 ^ 9 + 7\) 取模。
【解题思路】
考虑 DP。
设 \(f_{i, j}\),有:
- \(f_{i, 0}\) 表示位置 \(i - 1\)、\(i\)、\(i + 1\) 均无雷。
- \(f_{i, 1}\) 表示位置 \(i\) 无雷,\(i - 1\)、\(i + 1\) 有雷。
- \(f_{i, 2}\) 表示位置 \(i - 1\) 有雷,\(i\)、\(i + 1\) 无雷。
- \(f_{i, 3}\) 表示位置 \(i + 1\) 有雷,\(i\)、\(i - 1\) 无雷。
- \(f_{i, 4}\) 表示位置 \(i\) 有雷,\(i - 1\)、\(i + 1\) 任意。
有状态转移方程:
若 \(s_i\) 为
0,\(f_{i, 0} = f_{i - 1, 0} + f_{i - 1, 2}\)。1,- \(f_{i, 2} = f_{i - 1, 4}\)。
- \(f_{i, 3} = f_{i - 1, 2}\)。
2,\(f_{i, 1} = f_{i - 1, 4}\)。*,\(f_{i, 4} = f_{i - 1, 1} + f_{i - 1, 3} + f_{i - 1, 4}\)。?,- \(f_{i, 0} = f_{i - 1, 0} + f_{i - 1, 2}\)。
- \(f_{i, 1} = f_{i - 1, 4}\)。
- \(f_{i, 2} = f_{i - 1, 4}\)。
- \(f_{i, 3} = f_{i - 1, 0} + f_{i - 1, 2}\)。
- \(f_{i, 4} = f_{i - 1, 1} + f_{i - 1, 3} + f_{i - 1, 4}\)。
初始值 \(f_{0, 0} = f_{0, 3} = 1\),答案为 \(f_{n, 0} + f_{n, 2} + f_{n, 4}\)。
D. Maze 1D
【难度分析】
思维难度:B-
实现难度:D
总体难度:C+
评级: 提高+/省选-
【题目大意】
一个机器人在数轴上的 \(0\) 点。给一串指令,机器人按照指令走。
为了使机器人最后一步走到一个从来没来过的位置,我们可以在数轴上放石头。每次机器人被石头卡住他就跳过当前的那个指令。
问:最少使用石头的前提下,一共有几种放石头方法。
指令只包含 L 和 R。前者表示往左走,后者表示往右走。
- \(1 \leq 指令长度 \leq 10 ^ 6\)。
【解题思路】
结论题。
结论一:要么不用放石头,要么只放一块石头。并且放的石头一定碰到过。
证明:
为了保证使用的石头最少,显然,如果可以不放石头,那么就一定不放。
如果必须要放石头,必须经过它们,否则可以撤去一块。
如果不是一块,考虑放两块石头的情况:
- 它们在原点同侧,那么必须经过它们之间的所有点,并且最后停留在它们之间,显然最后停留的不是一个从来没来过的位置,不成立。
- 它们在原点同侧,那么碰到一块就不会往它后面走,那么它后面的石头也就没有用了,可以撤去。
多块石头同理。
证毕。
结论二:如果最后一步向左走,石头在原点右侧;否则石头在原点左侧。
证明:
如果不然,即石头在原点左侧,且最后一步往左走。由于必须碰到石头,所以走过的区间左端点为石头,右端点为这个点,可是最后一次往左走,那么一定会走到这个区间里。反之同理。
证毕。
结论三:石头可放的区间为以原点为一个端点的连续区间。
证明:
如果可以放石头,那么一定有一个最远的可以放石头的点,记为 \(x\)。
考虑石头的作用:拦截操作。如果石头在右边,那么拦截的是 R 操作,否则反之。
考虑所以比 \(x\) 小的点。它拦截的操作一定比 \(x\) 多。也就是说,机器人往反方向走(为什么往反方向走?参见结论二)的距离比 \(x\) 更多。但是 \(x\) 已经合法了,所以这个点一定合法。
证毕。
这样,我们的答案具有单调性,二分最远点,check 暴力模拟即可。

浙公网安备 33010602011771号