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 によって容易に求められます。
投稿日時:
最終更新:
