F - Buildings 2 解説 by ripity


ビル \(l\) から見えるビルを \(a = (a_1, \cdots, a_{|a|})\ (a_1\lt\cdots\lt a_{|a|})\)\(r\) から見えるビルを \(b = (b_1, \cdots, b_{|b|})\ (b_1\lt\cdots\lt b_{|b|})\) とします。

公式解説で述べられていた条件によれば、\(a\)\(b\) に共通する要素の個数を数えればよいです。 ここで、見えるビルの列をスタックで管理することを考えると、共通する要素は \(a\) および \(b\) の suffix をなします。 結局のところ、\(l\) に至るまでに \(b\) の suffix がどれくらい残るかが重要になります。

\(i = N, \cdots, 1\) の順で \(H_i\) をスタックに push するとして、\(H_i\) を push した直後のスタックのサイズを \(c_i\) とおきます。 答えは \(\min_{l\lt i\le r} (c_i - 1)\) です。 これは segtree によって容易に求められます。

投稿日時:
最終更新: