2020年2月24日月曜日

KUPC 2012 G - 村

とりあえずrange tree + fractional cascadingを貼ったらMLEした。

2点の表札が同じであるとき、またその時に限り、それぞれの点(x,y)(x,y)から見てもう一つの点は正方形[x2R,x+2R]×[y2R,y+2R][x-2R, x+2R] \times [y-2R, y+2R]に入っていることに注目して平面走査する[1]

各点(x,y)(x, y)についてクエリ(x,y,"add"),(x+2R,y,"delete")(x, y, \text{"add"}), (x + 2R, y, \text{"delete"})を用意しておいて、2N2N個のクエリをxxに関してソートする。あとはクエリの先頭から順に平衡二分木にyy座標を追加/削除していく。yyを追加する際に[y2R,y+2R][y-2R, y+2R]にすでに点がなければ、新しい表札が必要ということになる。


座標の重複があるのでmultisetにあたるものが必要だと思うけど、とりあえず普通のtreapを投げたら通ってしまった。(キーが全部衝突すると深さがO(N){O}(N)になるのでハック可能なはず。)


  1. 全部±2R\pm 2Rでやったが、もちろん±R\pm Rでもよい。 ↩︎