[CodeForces] CF404 题解

注:难度评级为 D 到 A,对标 NOIP T1 到 T4。+ 表示比原本难,- 反之。例如,D+ 比 D 难。难度评级仅供参考。 如果认为难度评级与实际难度不符,可以在评论区@我进行讨论。

本篇题解无复杂的公式推导,题目较清新自然,请放心食用。

斜体字为说明提示。通常与多倍经验有关。


A. Valera and X

Link-CF
Link-Luogu

【难度分析】

思维难度:D-
实现难度:D-
总体难度:D-
评级: 普及-

【题目大意】

判断一个 \(n \times n\) 的字符矩阵 \(A\) 是否合法。称其合法,当且仅当:

  • 矩阵两条对角线上的字符都相同。
  • 除了两条对角线以外的地方,字符都相同。
  • 矩阵不能只由一种字符组成。

合法输出 YES,否则输出 NO

  • \(3 \leq n \leq 300\)

【解题思路】

注意到 \(3 \leq n \leq 300\),模拟即可。


B. Marathon

Link-CF
Link-Luogu

题面看不懂,咕了


C. Restore Graph

Link-CF
Link-Luogu

【难度分析】

思维难度: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

Link-CF
Link-Luogu

【难度分析】

思维难度:C
实现难度:D-
总体难度:D+
评级: 普及+/提高

【题目大意】

一维扫雷。

给定一个字符串 \(s\)\(s\) 仅由 012*? 组成,它们表示:

  • 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

Link-CF
Link-Luogu

【难度分析】

思维难度:B-
实现难度:D
总体难度:C+
评级: 提高+/省选-

【题目大意】

一个机器人在数轴上的 \(0\) 点。给一串指令,机器人按照指令走。

为了使机器人最后一步走到一个从来没来过的位置,我们可以在数轴上放石头。每次机器人被石头卡住他就跳过当前的那个指令。

问:最少使用石头的前提下,一共有几种放石头方法。

指令只包含 LR。前者表示往左走,后者表示往右走。

  • \(1 \leq 指令长度 \leq 10 ^ 6\)

【解题思路】

结论题。

结论一:要么不用放石头,要么只放一块石头。并且放的石头一定碰到过。

证明:

为了保证使用的石头最少,显然,如果可以不放石头,那么就一定不放。

如果必须要放石头,必须经过它们,否则可以撤去一块。

如果不是一块,考虑放两块石头的情况:

  • 它们在原点同侧,那么必须经过它们之间的所有点,并且最后停留在它们之间,显然最后停留的不是一个从来没来过的位置,不成立。
  • 它们在原点同侧,那么碰到一块就不会往它后面走,那么它后面的石头也就没有用了,可以撤去。

多块石头同理。

证毕。

结论二:如果最后一步向左走,石头在原点右侧;否则石头在原点左侧。

证明:

如果不然,即石头在原点左侧,且最后一步往左走。由于必须碰到石头,所以走过的区间左端点为石头,右端点为这个点,可是最后一次往左走,那么一定会走到这个区间里。反之同理。

证毕。

结论三:石头可放的区间为以原点为一个端点的连续区间。

证明:

如果可以放石头,那么一定有一个最远的可以放石头的点,记为 \(x\)

考虑石头的作用:拦截操作。如果石头在右边,那么拦截的是 R 操作,否则反之。

考虑所以比 \(x\) 小的点。它拦截的操作一定比 \(x\) 多。也就是说,机器人往反方向走(为什么往反方向走?参见结论二)的距离比 \(x\) 更多。但是 \(x\) 已经合法了,所以这个点一定合法。

证毕。

这样,我们的答案具有单调性,二分最远点,check 暴力模拟即可。

posted @ 2024-11-22 10:24  Eliauk_FP  阅读(91)  评论(1)    收藏  举报