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

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