公式

E - Transformable Teacher 解説 by tatyam


先生の身長を固定し、先生と児童の身長を昇順に並べ替えたものを \(h_0, h_1, \dots, h_N\) とします。
このとき、 \((h_0, h_1), (h_2, h_3), \dots, (h_{N-1}, h_N)\) でペアを作るのが最適です。

証明 最適なときの $h_0$ のペアが $h_1$ でなく、 $(h_0, x), (h_1, y)$ でペアになっていると仮定します。 このとき、 $|h_0 - x| + |h_1 - y| \geq |h_0 - h_1| + |x - y|$ が成り立つので、 $(h_0, x), (h_1, y)$ の代わりに $(h_0, h_1), (x, y)$ でペアにするとして良いです。 $(h_0, h_1)$ はペアになるので $h_0, h_1$ を除外し、残りの人たちについて同様の議論を再帰的に適用することで、 $(h_0, h_1), (h_2, h_3), \dots, (h_{N-1}, h_N)$ が最適であることがわかります。

したがって、\(H\) をソートしておき、すべての変身形態 \(w\) について、 \(H\) の適切な位置に \(w\) を挿入して身長の差の合計を求めることで、 \(O(NM+N\log N)\) でこの問題を解くことができます。

しかし、このままでは TLE です。

回答例 (Python) : https://atcoder.jp/contests/abc181/submissions/17733459

そこで、 \(|H_{2i-1}-H_{2i}|\) の累積和 と \(|H_{2i}-H_{2i+1}|\) の累積和を持つと、挿入や合計に \(O(N)\) かける必要がなくなり、 \(O((N + M) \log N + M \log M)\) でこの問題を解くことができます。

回答例 (C++) : https://atcoder.jp/contests/abc181/submissions/17734513
回答例 (Python) : https://atcoder.jp/contests/abc181/submissions/17733390

また、 \(W\) をソートしておき、 \((H_{2i-1},H_{2i})\) でペアになる部分と \((H_{2i},H_{2i+1})\) でペアになる部分の境界と身長の差の合計を持って、しゃくとり法をしてもこの問題を解くことができます。

回答例 (Python) : https://atcoder.jp/contests/abc181/submissions/17733416

投稿日時:
最終更新: