plane_sweep/lib.rs
1//! 平面走査。
2//!
3//! ## Idea
4//!
5//! 可換モノイド $`(S, \circ, e)`$ がある。
6//! $`n`$ 個の相異なる点 $`(y_i, x_i)`$ と $`f(i) \in S`$ が与えられる。
7//! 必要に応じて座標圧縮などを行うことで、$`x_i\in[0\lldot n)`$ とする。
8//! このとき、$`y\in[-\infty\lldot y_r)`$ かつ $`x\in[x_l\lldot x_r)`$ なる点たちにおける
9//! $`\circ`$ での fold を高速に求めたい。
10//!
11//! $`a = (a_0, a_1, \dots, a_{n-1})`$ で初期化し、$`y`$ の昇順[^1]に点を処理する。
12//! $`a_{x_i} \xgets{\circ} f(i)`$ で更新しつつ、$`y\lt y_r`$ について処理し終えたら
13//! $`a_{x_l}\circ\dots\circ a_{x_r-1}`$ を求めればよい。
14//!
15//! [^1]: 必要に応じてソート順は変更してもよい。
16//!
17//! $`(S, \circ)`$ が逆元を持つ状況では、適切に点を追加することで $`y\in[y_l\lldot y_r)`$
18//! での fold を求めることもできる。
19//!
20//! ## Applications
21//!
22//! 点 $`(y_i, x_i)`$ に対し、$`y_j \lt y_i`$ かつ $`x_j \lt x_i`$ なる点 $`(y_j, x_j)`$ であって
23//! $`f(j) \lt f(i)`$ なるものが存在するか?という問題を考える ([ABC 309 F])。
24//!
25//! [ABC 309 F]: https://atcoder.jp/contests/abc309/tasks/abc309_f
26//!
27//! ある $`j\in[0\lldot n)`$ に対して $`f(j)\lt f(i)`$ というのは $`\min_{j\in[0\lldot n)} f(j)\lt f(i)`$
28//! と言い換えることができる。よって、$`(S, \min, \infty)`$ について上記の枠組みを適用することで解ける。