这一份只说第二题喷水小奶龙。旭扬把输入读完了,文件名也没写错,代码是跑完的;0 分是因为题里龙喷湿的是右侧一整段,旭扬看成了两个相邻格子,安全位置怎么判也跟着偏了,下标还对错了一位。下面对着代码逐行说。
这题 0 分,但不是流程上出的问题。文件名 nailoong.in / nailoong.out 和题面一致,\(n\) 和位置都读进来了。看第 20 行:每来一只龙,代码只把 \(\{p_i,\ p_i-1\}\) 记成已占,再数还剩几个没标记的格子。题面里这只龙从 \(p_i\) 一直喷到 \(n\),是右侧一整段;能躲的位置,是站在所有龙位置的左边。代码数的是"没被点到的格子",判据变成剩余格子数 \(>1\),和题目问的"有没有至少一个安全位置"已经不是一回事。
nailoong 一共 36 行,输入和输出都没出错,问题在中间处理这一段:安全位置还没在纸上想清楚,代码已经开始标格子了。
下面贴的是旭扬自己的 nailoong.cpp,出问题的行我标了底色,可以对着原文件核;卡片后面是正解思路,以及我上课准备怎么带旭扬改。
这题输入、文件名、逐行输出旭扬都没出错,流程上不丢分。差的是拿到题先理结构这一步,下面四条按要紧程度排。
读完题先标格子、数剩余,没先想"安全位置是哪些、题目要的判据是什么"。这题把后缀区间看成两个点,主要就是结构还没理清,代码就先下去了。
这类"站在某一侧、落在某一段"的题,正解是维护前缀最小(最大)值;旭扬写成了布尔数组逐个标记。维护区间极值、取集合交集的写法,还没练熟。
"有没有至少一个安全位置",对应的是 min > 1;代码换成了"未标记格子数 > 1",数的东西和门槛都偏了。把题面一句话翻译成 min / max 判断,这一步还不熟。
\(1\)-based 和 \(0\)-based 怎么平移、哪里会越界、阈值 \(>0\) 和 \(>1\) 差在哪,条件写了但位置对不上。位置 \(n\) 被跳过、位置 \(1\) 落错下标,属于这一类,不是思路完全不会。
底子不用重搭。这题输入输出都稳,丢的是建模和边界,算不上全新知识,带着练两三周能看到变化。下面分三步,每步写了怎么算过关。