[NOIP2021] 方差 题解
来源:NOIP2021 T3
难度:省选/NOI-
首先看一下题目中我们可执行的操作,将 \(a_i\) 变为 \(a_{i-1}+a_{i+1}-a_{i}\)。显然这题跟方差有关,我们就需要考虑它的差分数列。举个栗子:
- 对于数列 \(1,3,4,6\),它的差分数列为 \(2,1,1\),当我们对第二位 \(3\) 采取操作时,\(3\) 会变成 \(1+4-3=2\),数列就变为了 \(1,2,4,6\),所对应的差分数列就变为了 \(1,2,1\)。
对于上面的栗子,不难发现一个特征,我们执行操作的本质其实就是 \(\text{swap}(d_{i-1},d_i)\),其中 \(d\) 为差分数组。
到此为止我们得到了题面中很重要的一个隐藏条件,接下来我们看一下我们需要求什么。题目中的说明为“我们需要求出所求的方差的最小值的 \(n^2\) 倍”,那么转换为柿子推一下(为便于书写,我们不妨设 \(S=\sum_{i=1}^{n}{a_i}\)):
到这里我们也是很巧妙的把答案通过完全平方公式和乘法分配律的方式化成了这样,但其实到这里可以猜一下结论。但是我比较菜,我猜不到,于是开始联系一下我们刚才推出的隐藏条件继续进行推理:
里面用了一些省选的小 trick。
根据最后推出的答案可以看出答案最小的时候差分数列呈现单谷形态,即答案最小时差分值先减后增。
根据单谷的对称性,我们易知,情况需要分两种,第一种是 \(j<k\) 或 \(j>k\),第二种是 \(j=k\)。
那么第一种情况的时候我们选取 \(\sum\limits^{n}_{i=1}d_i^2\cdot i(n-i)\),第二种情况即选取 \(2\sum\limits^{n-1}_{j=1}\sum\limits^{n-1}_{k=j+1}d_jd_k(n-j)k\)。这样的话就避免了我们如果把情况看做 \(j\leq k\) 的时候多次减的情况。很简易。
推出来这个柿子,也就证明出来了结论的单谷形态。但我们推转移方程式的话使用这个不免有些繁琐,所以我们继续使用 \(n\sum\limits^{n}_{i=1}a_i^2-(\sum\limits^{n}_{i=1}a_i)^2\) 这个柿子来写方程式。
设 \(f_{i,j}\) 为已经处理了 \(i-1\) 个差分数列中的值,\(j\) 是 \(a\) 的和时最小的平方和,现在需要考虑放在单谷左支和右支那边更划算一点。
因此我们可以推出转移方程式:
-
左支:\(f_{i,j+i\cdot d_i}=\min\{f_{i-1,j}+2\cdot j\cdot d_i+i\cdot d_i^2\}\)
-
右支:\(f_{i,j+\sum_{k\ =\ 1}^i}=\min\{f_{i-1,j}+\sum\limits_{k=1}^id_k^2\}\)
显然最后答案就是 \(ans=\min\limits_{j=0}^{maxn}\{n\cdot f_{n,j}-j^2\}\),\(maxn\) 是我们得到的 \(a\) 的和的最大值。
这道题基本思路到这就为止了。但是我们算一下复杂度显然是 \(O(n^2a)\),肯定会炸。但是我们换一个角度思考,由于 \(n\) 的取值范围比 \(a\) 大,所以当 \(n\) 的取值范围很大的时候,我们的数列中一定是有很多项为 \(0\) 的,那我们把这些项直接跳过,剩下非零项至多就是 \(a\) 个。因此我们的复杂度就可以优化到 \(O(na^2)\),严谨一点来说复杂度是 \(O(min\{n,a\}\cdot n\cdot a)\)。
此题证毕。
代码咕一会。

浙公网安备 33010602011771号