コンテスト名が長すぎる…
解法
取り得る区間の累積和の絶対値の総和を求めよと言われている。
まず配列について区間の累積和の求め方を考えると、までの累積和から、までの累積和を引けば求まる。
つまり、からまでの累積和をと置けば、
となる。
ところで、絶対値を求めよと言われているので、以下のように場合分けする。
この式をもとに本位で考えると、
- 未満のインデックス向けには、自身より大きいものの数だけを引き、自身以下のものの数だけ足す
- 以上のインデックス向けには、自身より大きいものの数だけを引き、自身以下のものの数だけ足す
となることがわかり、結果的には、累積和配列全体をソートし、自身以上のインデックスの分引く、自身未満のインデックスの分足す、とするだけで答えが出ることがわかる。
実装例は以下の通り。
Submission #49840787 - 技術室奥プログラミングコンテスト#6 Day1
あとがき
最初解いたときには、「結果的には...」のところが気づけなくて、座圧+Fenwick木で自身の前後の自分より大きい/小さい要素の数をクソ真面目に数えていました。
記事書きながら思考まとめる最中で、あれこれ条件もっとシンプルにできるんじゃないか、と気づきました。備忘録書くなかでも発見はありますね。