[NOIP2021] 方差

发布时间 2023-10-13 17:25:13作者: ydtz

手玩一下会发现,每次操作本质上是在交换差分序列中相邻的两项。(这意味着我们找性质时要多关注例如前缀和序列、差分序列等的变化)

除此之外,推两步方差式子 \(\times n^2\) 也可得到,题目实际是要求:

\[n\sum a_i^2-(\sum a_i)^2 \]

然后我们就卡了。不过由于这是一道最优性题目,已经可以通过随机化算法拿到较高分数。

显然此时我们是需要一些性质的,不然题目无法推进。那就思考条件和询问之间的关系,即差分序列和原序列方差之间的关系。这个关系没必要太强,它可以是一个模糊的序列形态——比如由于要求方差,我们会尽可能地使得序列居中,此时差分序列大概会呈现单谷状,通过临项交换法可以证明这一点。

此时我们就得到了本题的核心性质,有了它之后就可以 dp 了。具体来说,把差分序列 \(d_i\) 重排后,对于每个数我们可以选择将它插入左侧或右侧。\(a_i\) 较小启示我们将它列入状态,于是我们可以设 \(dp_{i,j}\) 表示差分序列的前 \(i\) 项插入序列后,当前 \(a_i\) 之和为 \(j\)\(\sum a_i^2\) 的最小值,转移时分别考虑插入左侧或右侧对于两部分答案的影响即可。

此时时间复杂度 \(O(n^2a)\),注意最后一个 subtask 中 \(a_i\) 非常小,对应到差分序列中即,不为 \(0\)\(d_i\) 至多只有 \(50\) 个,剩下的全为 \(0\)。我们发现若干 \(d_i=0\) 构成的 \(a_i\) 一定都为初始差分值,故把它列为初始状态后再 dp 剩下 \(d_i\neq 0\) 的状态即可,时间复杂度优化为 \(O(na\times \min(n,a))\).

操作等价,通过条件和询问之间的关系描绘形态。