Strorkisのブログ

信憑性については悪しからず

yukicoder No.1170 Never Want to Walk

問題

https://yukicoder.me/problems/no/1170

座標が x_{i}である N個の駅がある。 A \leq |x_{i} - x_{j}| \leq Bのとき、駅 iと駅 jに無向辺が張られている。各駅が含まれる連結成分の数を求めよ。

解法

座標が小さい順に見ていく。

Union-Findを用いて、各駅 iにおける、 x_{i} + Aから x_{i} + Bの間に存在する駅を(二分探索等で列挙し)uniteすることで、 O(N^{2})で求めることができるが、これだとTLEしてしまう。

そこで、尺取り法を用いる。
具体的には、一つ前の駅において最後に辺が張られた駅(無ければ自分自身)を保存しておき、そこから探索を始める。
そうすることで、一つ前の駅と範囲が被っている部分は、最後に辺が張られた駅がuniteされることでカバーされるため、重複部分を探索する必要がなくなり、おおよそ O(N)で求めることができる。

コード

https://yukicoder.me/submissions/530719

一言

尺取り法楽しい。