CF1817E Half-sum

greedy

把数分成两个集合 \(A,B\),且 \(A<B\)。令每个集合的数的个数分别是 \(a,b\)。令 \(A_1\dots A_a,B_1\dots B_b\) 分别有序。

定理 \(1\)

\(A\) 集合合并的顺序一定是从大往小的,\(B\) 集合是从小往大的。

应该很好猜到,但是证明需要一点推导。

大概可以局部到 \(x,y,z,w\) 四个数的情况。

几种情况分别是 \(\frac{x+y}{8}+\frac{z}{4}+\frac{w}{2}\)\(\frac{x+y+z+w}{4}\)\(\dots\)。比较一下发现第一种情况就是最优的。

定理 \(2\) \(\max A<\min B\)

由于集合内部贡献的计算是固定,如果存在 \(A_i>B_j\),显然交换会更优(\(A\) 会变小 \(B\) 会变大)。

于是我们得到一个平方做法:枚举 \(i\) 前面是 \(A\) 后面是 \(B\),直接模拟计算贡献。Submission #212568859 - Codeforces

不要害怕推导,考虑 \(i\to i+1\) 会发生什么?\(\Delta=\frac{a_{i+1}-a_{i}}{2^{n-i}}-\frac{a_i-a_{i-1}}{2^{i-1}}\)

\(b_i=a_{i}-a_{i-1}\)。那么就有

\[\Delta_{i\to j}=\frac{b_j}{2^{n-j+1}}-\frac{b_i}{2^{i-1}}+\sum_{k=i+1}^{j-1}(\frac{1}{2^{n-k+1}}-\frac{1}{2^{k-1}})b_k \]

继续分析这个式子,当 \(i<j\le \frac{n}{2}\) 时,由于 \(2^{n-j+1}\) 较大且 \(2^{i-1}\) 较小。所以当 \(i\le \frac{n}{2}-30\),且 \(b_i\ne 0\) 时就一定不会继续右移。右边同理。所以我们只需要 check 左右各 \(30\) 个数或者之后的第一个 \(b_i\ne 0\) 的位置即可。

Submission #212584916 - Codeforces

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章