Official

F - Shift and Inversions Editorial by tatyam


転倒数は Fenwick Tree を用いる方法などで \(O(N \log N)\) で求めることができます。
しかし、これを全ての \(B\) について行うと \(O(N^2 \log N)\) になって TLE してしまいます。

そこで、 \(k = i\) から \(k = i + 1\) に動かしたときに \(B\) があまり変化していないことに注目して、転倒数の変化を見てみましょう。

\(k = i\) から \(k = i + 1\) に動かすことは、

  • \(B\) の先頭の \(a_i\) を削除する
  • \(B\) の末尾に \(a_i\) を追加する

と言い換えることができます。
\(B\) の先頭の \(a_i\) を削除すると転倒数は \(a_i\) 減り、 \(B\) の末尾に \(a_i\) を追加すると転倒数は \(N - 1 - a_i\) 増えるので、
\(k = i\) から \(k = i + 1\) に動かすと、転倒数は \(N - 1 - 2 \times a_i\) 変化することになります。

転倒数の差分が \(O(1)\) で求められるので、 \(A\) の転倒数を求める部分がボトルネックになって、 \(O(N \log N)\) でこの問題を解くことができます。

回答例 (C++) : https://atcoder.jp/contests/abc190/submissions/19761416
回答例 (Python) : https://atcoder.jp/contests/abc190/submissions/19761422

posted:
last update: