2026 dmy 模拟赛

第一场

  • A

错因分析:没有从式子中最难的部分入手,导致完全没思路。

正解:

  1. 考虑去掉题目中的 \(\min\),想到从小到大枚举数值构造 \(p\),这样每次填入的第一个数就是最小值。

  2. 因为要求所有方案的权值和,考虑 dp。发现状态并不明显,所以先推转移。

  3. 分情况讨论:如果当前的数值填入以前的段,则它的贡献就是这个段的空位乘上 dp 值;如果当前的数值填入新的段,则它的贡献就是空余区间个数乘以空余区间长度乘以它自身的值。

  4. 不难发现这两个转移式子都和区间具体位置无关,只和区间有效长度有关。所以我们可以使用混合进制的方法来压缩状态。具体而言,我们将所有同样长度的区间归为一类,然后记录每个长度的剩余区间即可,具体见代码。

总结:

  1. 观察:从最难处入手

  2. dp:见权值和想 dp、从转移推状态、混合进制压缩技巧

  • B

错因分析:不知道最短路图。

正解:建出最短路图后跑 dfs,按照编号从小到大访问出边并维护编号之和,如果第二次访问到某个点,说明它存在两条最短路,这时的编号之和即为这个点的答案。

总结:最短路计数相关——建最短路图

  • C

错因分析:没有对式子和单调性的敏感度。

正解:

  1. 观察到权值的式子很像方差,展开后我们发现它正好是 \(m\) 倍方差,即 \(m \sum y_i^2 - (\sum y_i)^2\)

  2. 考虑方差的结论:当 \(t\) 取平均数时,\(\sum (y_i-t)^2\)(即方差的 \(m\) 倍)取得最小值。所以问题转化为考虑在 \(t\) 的移动过程中,求 \(\sum (y_i-t)^2\) 的最小值。

  3. 这个 \((y_i-t)^2\) 显然就是在考查 \(y_i\)\(t\) 的距离。当 \(t\) 向右移动时,选取的 \(m\) 个点显然也会向右移动,这明显具有单调性。进一步的,我们发现每个点都具有一段“存活区间”(考虑一个点的同色前驱和后继,当 \(t\) 移动的足够左,至少它的前驱会替代它,后继同理,所以是一段区间)。

  4. 如果我们能够求出存活区间,就可以像单调队列那样子,考虑每一个区间,然后在左端点加入某些点,在右端点删除某些点,然后动态的维护 \(\sum y_i\)\(\sum y_i^2\) 即可。

  5. 考虑如何求出存活区间。首先我们发现 \(l_i,r_i\) 可以对称求取,所以下面只讲述 \(l_i\) 的求法。对于点 \(i\),记它的同色前驱为 \(p\),显然 \(l_i \ge \frac{x_p+x_i}{2}\)(不然 \(p\) 可以替代 \(i\));然后记 \(i\) 前面距离 \(i\)\(m\) 近的点为 \(q\),显然 \(l_i \ge \frac{x_q+x_i}{2}\),这两者取 \(\max\) 就是左边界。其中 \(q\) 可以使用堆来维护。

  6. 求出存活区间之后,我们按照第四步的流程做即可。实现上的细节很多,包括但不限于删除标记、维护有效点个数、先加入后删除(因为要统计到所有最小值)等细节,具体见代码。

总结:

  1. 观察:方差结论、单调性区间

  2. 代码:单调队列思想、堆维护 \(m\) 大的代码实现技巧

  • D

待补。

posted @ 2026-09-08 01:15  _KidA  阅读(7)  评论(0)    收藏  举报