No.062 D
の前半を から選び, 後半を から選ぶとする. は となる.
前半はなるべく大きい数を選び, 後半はなるべく小さい数を選ぶようにすればいい.
これを愚直に実装すると となり, 部分点がもらえるはずである.
の上位 個の和を求める方法であるが, 優先度付きキューを使う.
まず の和を計算し, 同時に最小値を返す優先度付きキューに入れておく.
次に とキューの最小値を比べ, の方が大きければ和は とキューの最小値の差分だけ大きくなる. そしてキューの最小値を に置き換える. の方が小さければ何もしない.
以下これを繰り返すことで の範囲の計算を で行うことができるので, 満点をもらえる.
後半部も同様に求めて, 最後に前後半の差の最大値を求める.