Official

F - Max Matrix Editorial by QCFium


便宜上サンプル \(1\) で示したような行列を用いた解説となります。
タイプ \(1\) の処理を考えます。
\(a_i\)\(x\) から \(y\) に置き換えることを、一旦行列の \(i\) 行目を除去し、\(y\) に置き換えた後の新しい \(i\) 行目を復活させると考えます。
すると求めるべきは \(a_i = x\) のときの \(i\) 行目の和です。
これは \((b_j \lt x\) であるような \(j\) の数 \() \times x + (b_j \ge x\) であるような \(b_j\) の和 \()\) となります。
タイプ \(2\) によって \(b_j\) にも変更が入りますから、以下のようなデータ構造が必要です。

  • 数の集合を管理する
  • 数の削除、追加をサポートする
  • 指定の数以下の要素数を求められる
  • 指定の数以上の要素の和を求められる

これは平衡二分探索木を使ってもよいですが、座標圧縮とセグメント木で解くことができます。具体的には \(c_i : b\) の中の \(i\) の出現数 という数列を (適切に \(i\) を座標圧縮して) セグメント木 で管理すると指定の数以下の要素数を求めるクエリに対応でき、指定の数以上の要素の和を求めるクエリも同様にできます。

タイプ \(2\) についても同様で、\(a, b\) を入れ替えて考え、同じデータ構造を使って処理すればよいです。

posted:
last update: