[CodeForces] CF404 题解

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

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

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


A. Valera and X

Link-CF
Link-Luogu

【难度分析】

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

【题目大意】

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

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

合法输出 YES,否则输出 NO

  • 3n300

【解题思路】

注意到 3n300,模拟即可。


B. Marathon

Link-CF
Link-Luogu

题面看不懂,咕了


C. Restore Graph

Link-CF
Link-Luogu

【难度分析】

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

【题目大意】

给定 nk,构造一个无向图,使得从某一点开始到第 i 个点最短路为 di

不存在输出 -1

  • 1n,k1051di<n,输出的总边数应该不超过 106 条。

【解题思路】

考虑到构造图较难,我们可以构造树。

根节点可以选 di0 的点。这样,di 表示的就是每个点到根节点的距离,即深度。

知道深度了,我们只需要上一层的向下一层的连边即可。容易证明这样构造是对的。

不合法情况:

  • 不存在 di0 的点。
  • di=0 的点不止一个。
  • 根节点度数 k
  • 某个节点度数 k1。即设第 i 层(1i<)点数为 a,第 i+1 层点数为 b,有 a×(k1)<b

D. Minesweeper 1D

Link-CF
Link-Luogu

【难度分析】

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

【题目大意】

一维扫雷。

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

  • 0:它的左边和右边都没有雷。
  • 1:它的左边和右边有一边有雷。
  • 2:它的左边和右边都有雷。
  • *:它是雷。
  • ?:它未知。

? 替换为其他的任意一个,求总方案数,对 109+7 取模。

【解题思路】

考虑 DP。

fi,j,有:

  • fi,0 表示位置 i1ii+1 均无雷。
  • fi,1 表示位置 i 无雷,i1i+1 有雷。
  • fi,2 表示位置 i1 有雷,ii+1 无雷。
  • fi,3 表示位置 i+1 有雷,ii1 无雷。
  • fi,4 表示位置 i 有雷,i1i+1 任意。

有状态转移方程:

si

  • 0fi,0=fi1,0+fi1,2
  • 1
    • fi,2=fi1,4
    • fi,3=fi1,2
  • 2fi,1=fi1,4
  • *fi,4=fi1,1+fi1,3+fi1,4
  • ?
    • fi,0=fi1,0+fi1,2
    • fi,1=fi1,4
    • fi,2=fi1,4
    • fi,3=fi1,0+fi1,2
    • fi,4=fi1,1+fi1,3+fi1,4

初始值 f0,0=f0,3=1,答案为 fn,0+fn,2+fn,4


D. Maze 1D

Link-CF
Link-Luogu

【难度分析】

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

【题目大意】

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

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

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

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

  • 1106

【解题思路】

结论题。

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

证明:

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

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

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

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

多块石头同理。

证毕。

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

证明:

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

证毕。

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

证明:

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

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

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

证毕。

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

posted @   Eliauk_FP  阅读(50)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示