geam1113’s diary

主にAtcoderのコンテストの備忘録を書きます。AtCoder緑と水色を行ったり来たりしています。

AtCoder Beginner Contest 299 メモ

コンテストページ: Tokio Marine & Nichido Fire Insurance Programming Contest 2023(AtCoder Beginner Contest 299) - AtCoder
コンテスト中AC: A〜E

D - Find by Query

20回以下の指定なので、log時間の方法を疑います。すなわち、二分探索です。

最初、l = 1, r = Nとします。最初、[l,r]は、0......1です。

m=\lfloor \frac{r+l}{2}\rfloorとします。 S_m = 0の場合、0...0...1という感じです。l\leftarrow m とすると、[l,r]は、0......1となります。

S_m = 1の場合、0...1...1という感じです。r\leftarrow m とすると、[l,r]は、0......1となります。

このように二分探索を繰り返すと、常に[l,r]は、0......1という状態が保たれます。r=l+1となるまでこれを繰り返し、lpとすれば、答えの条件を満たします。

実装: Submission #40850245 - Tokio Marine & Nichido Fire Insurance Programming Contest 2023(AtCoder Beginner Contest 299)

E - Nearest Black Vertex

問題文中の条件である、

  • 全てのp_iについて、p_iとの距離がちょうどd_iであるような頂点の内のいずれかを黒に塗る

について、どの頂点を黒にすればよいか決めることは困難です。しかし、白に塗る頂点は以下のように確定します。

  • 全てのp_iについて、p_iとの距離がd_i未満であるような頂点は全て白で塗る

これにより、全てのp_iについて、黒に塗った頂点との距離が最小のものがd_i未満とならないことが保証されます。

白で塗った頂点以外は、何色で塗ってもよいです。そのため、条件を満たすために黒で塗るのが最適です。

これで白黒の塗り方が決まりました。後は、問題文の条件を満たすか確かめれば良いです。

塗り方の決定及び条件を満たすかの確認は全点対間最短経路が分かっていればよく、Warshall-Floyd法では間に合わないので、全頂点を始点としてBFSを行えばよいです。計算量はO(N(N+M)+NK)だと思います。

実装: Submission #40877876 - Tokio Marine & Nichido Fire Insurance Programming Contest 2023(AtCoder Beginner Contest 299)