精進記録 : Educational Codeforces Round #56 G - Multidimensional Queries
問題概要
個の 次元上の点 が与えられる.
このとき, 個の次のクエリに答えよ.
1. が与えられる. を に変更する.
2. が与えられる. マンハッタン距離1の最大値 を出力する.
制約
問題リンク codeforces.com
考察
愚直に考えると、変更は , 最大値を求めるのに全てのペアに調べると がかかってしまい, 到底間に合わない(特に, 最大値を求める部分). そこで が 5以下という非常に小さい制約があることから, おそらくこれを利用して, 最大値を求める部分を高速に処理できればよいだろうと考えられる(今持っている情報を に載せたい).
さて, ここでマンハッタン距離について一度考えることにしよう.
マンハッタン距離は絶対値が含まれているため、一つの点を固定したときに、その固定した点の各成分が正として振る舞うのか, それとも負として振る舞うのかはもう一点との関係によって定まってくる. それゆえ距離の最大値を求める際に, 各点の情報が2次元的に必要になるように感じられる.
しかし, もし絶対値がなければどうだろうか. 2点間の成分の和の最大値というのは, 各点の成分の和の最大値と最小値が分かれば容易に求めることができる(ある種1次元的な情報に落とし込める). そして, これは点更新セグメント木を使って更新, クエリともに で高速に処理することができる.
元の問題に視点を戻すと, 求めるられているのは絶対値の和である. どのようにして求めることができるだろうか. それは 各成分を正負の方向に移動させた空間上で、上の値を求めることである. なぜなら 一般に実数 に対して かつ であるので, 任意の数列 に対して, 少し雑な記法を許すと が成り立つからである. 2
正負の方向を bit列で管理して (これは高々 個) 最大値と最小値の差を求めるセグメント木を使って全方向を探索すれば、このクエリに で答えることができ、更新も で十分高速に行うことができる. これにより、この問題を解くことができた