Crate plane_sweep
source ·Expand description
平面走査。
§Idea
可換モノイド $(S, \circ, e)
$ がある。
$n
$ 個の相異なる点 $(y_i, x_i)
$ と $f(i) \in S
$ が与えられる。
必要に応じて座標圧縮などを行うことで、$x_i\in[0\lldot n)
$ とする。
このとき、$y\in[-\infty\lldot y_r)
$ かつ $x\in[x_l\lldot x_r)
$ なる点たちにおける
$\circ
$ での fold を高速に求めたい。
$a = (a_0, a_1, \dots, a_{n-1})
$ で初期化し、$y
$ の昇順1に点を処理する。
$a_{x_i} \xgets{\circ} f(i)
$ で更新しつつ、$y\lt y_r
$ について処理し終えたら
$a_{x_l}\circ\dots\circ a_{x_r-1}
$ を求めればよい。
$(S, \circ)
$ が逆元を持つ状況では、適切に点を追加することで $y\in[y_l\lldot y_r)
$
での fold を求めることもできる。
§Applications
点 $(y_i, x_i)
$ に対し、$y_j \lt y_i
$ かつ $x_j \lt x_i
$ なる点 $(y_j, x_j)
$ であって
$f(j) \lt f(i)
$ なるものが存在するか?という問題を考える (ABC 309 F)。
ある $j\in[0\lldot n)
$ に対して $f(j)\lt f(i)
$ というのは $\min_{j\in[0\lldot n)} f(j)\lt f(i)
$
と言い換えることができる。よって、$(S, \min, \infty)
$ について上記の枠組みを適用することで解ける。
必要に応じてソート順は変更してもよい。 ↩