2026年9月15日火曜日

Codeforces Round 1120 (Div. 2)

 C1まで。
 Div. 1とDiv. 2が分かれている回でDiv. 2に出なくちゃいけないこと自体悔しいのに、そこで大失敗してしまった。

コンテスト後のツイート

C2. Floor of MEX (Hard Version)

 結局、次の問題が解ければ良い。

 自然数1,2,...,nからいくつかを選ぶ場合の数のうち、 
・[l_i,r_i]から少なくとも一つ選ぶ 
 という条件Q個を満たすものの個数を求めて下さい。

 これをO(n+Q)くらいで解ければ良い(logが付いても良い)のだが、解けなかった。

 コンテスト中は包除原理を主に考えていた。
 これらの条件のうち、満たさない個数が偶数個の個数は求まるのだろうか? などと。この方針は筋が悪かった。

 これはもっと直接的にDPで求めることができる。

・DP[i]を、「1...iについて条件を満たし、iを選んだときの求める個数」

 とすれば良い。
 こうすると、[l_i,r_i]から少なくとも一つ選ぶという条件は、「r_iより大きいjについて考えたとき、その一つ前に選んだ数はl_i以上である」という条件に直すことができ、それを利用すると累積和を使えばDPが回る。

(なお、DP[i]=「1...iについて条件を満たす場合の数」としても答えを求めることができるが、ちょっと遷移が複雑)

 これくらいの問題は簡単に解けなくちゃいけないんだろうけど……。筋の悪い解法にハマって抜け出せなくなってしまった。

D. Culling Game

 解説AC。

 「後ろから見る」という方針を知っても自力では答えに辿り着けず。

 降参位置を管理して解くのだが、そうできるポイントは、

 「ある降参位置で新しいチャンピオンが勝てた場合、そのチャンピオンのpowerは、以前のチャンピオンのpower以上になる。そのため、それより右にある降参位置を順に再評価できる。」(ChatGPTに整理してもらったもの)

 ということだった。
 これに気付ければあとはデータ構造を使ってがんばる問題になるが、その実装もなかなか大変だった。


0 件のコメント:

コメントを投稿