問題 http://abc062.contest.atcoder.jp/tasks/arc074_b
解説pdf https://abc062.contest.atcoder.jp/editorial
私の解答 http://abc062.contest.atcoder.jp/submissions/1300976
heapq doc https://docs.python.jp/3/library/heapq.html
本問題では優先度付きキューを使う。ソートされた状態を保ちつつ、最小値をO(1)で取得できる。最大値バージョンの優先度付きキューが使いたいときは、キューに入れる値に-1をかけて対応する。Pythonでの優先度付きキューの使い方は以下の通り。
import heapq a = [6, 3, 2, 4, 5] heapq.heapify(a) # 準備 v = heapq.heappop(a) # 最小値をヒープから取り出す heapq.heappush(a, 123) # ヒープに要素を追加する
配列aのうち、絶対に前半に含まれる最初のN個を配列Bとし、そこから右に拡大しつつ、配列内の大きい方からN個の和を差分で求めつつ記録する。同様に、絶対に後半に含まれる最後のN個を配列Cとし、そこから左に拡大しつつ、同様に記録を取る。最後にその2つの記録を使って最適な切れ目を求めればいい。