Google Code Jam 2019 Round1B : Manhattan Crepe Cart

問題. Manhattan Crepe Cart

 Q \times Q の格子上に  P 人がいる. i 番目の人は  (x_i, y_i) にいて東西南北のいずれか  d_i (順番に 'E', 'W', 'S', 'N')を向いている.すべての人はクレープ屋に最小の移動距離で移動しようとしている.ただし,距離はマンハッタン距離である.多くの人が向かう可能性のあるクレープ屋の場所を答えよ.ただし,向かう人数が同じになるクレープ屋の候補が複数ある場合は座標値が最小となるものを答えよ.

制約 Q = 10^5,  1 \le P \le 500,  0 \le x_i, y_i \le Q

解法.累積和

クレープ屋の場所を決めるときに東西方向と南北方向は互いに独立に決めれるので,ここでは南北方向について考える( y 座標). i 番目の人が  (x_i, y_i) にいて北に向かっているときに,この人が向かうクレープ屋の場所の候補は  (x, y) 0 \le x \le Q, \, y_i < y)を満たす必要がある.同様に, i 番目の人が南を向いているときは  (0 \le x \le Q, \, y < y_i) を満たす必要がある.すなわち,南北方向の座標が  y のクレープ屋に向かう可能性のある人数は,現在いる場所が  y_i < y を満たす北を向いている人数と, y < y_j を満たす南を向いている人数の和である. O(P) 時間と  O(Q) 領域の前処理で累積和求めると,各  0 \le y \le Q に対してその場所に向かう可能性のある人数を  O(1) 時間で求めることができるので,それらの最大値は  O(Q) 時間で求まる.
同様に東西方向に対しても独立に求めれば答えが求まる.

計算時間 O(P + Q)

問題内容を勘違いして1時間ほどかかってしまった orz.問題を理解してからは解法はすぐ思いつく問題なのに残念すぎる.