No.062 D

の前半を から選び, 後半を から選ぶとする. となる.

前半はなるべく大きい数を選び, 後半はなるべく小さい数を選ぶようにすればいい.

これを愚直に実装すると となり, 部分点がもらえるはずである.

の上位 個の和を求める方法であるが, 優先度付きキューを使う.

まず の和を計算し, 同時に最小値を返す優先度付きキューに入れておく.

次に とキューの最小値を比べ, の方が大きければ和は とキューの最小値の差分だけ大きくなる. そしてキューの最小値を に置き換える. の方が小さければ何もしない.

以下これを繰り返すことで の範囲の計算を で行うことができるので, 満点をもらえる.

後半部も同様に求めて, 最後に前後半の差の最大値を求める.