情報妖精の競プロ日記

AtCoderの問題に対する方針を主に書きます

AtCoder Grand Contest 026

AtCoder Grand Contest 026 に参加しました!
AtCoder Grand Contest 026 旧版
AtCoder Grand Contest 026 beta版

解けた問題だけ解説をしていきますー

要項

AtCoder Grand Contest 026
rated
7/14(土) 21:00 ~ 23:30 (150分)
200-600-600-1100-1600-2000 (6問)
ペナルティ: 5分

方針

3完できれば恐らくパフォーマンス2400届く、2完なら早解きになるかな?
最低でも2問、幾何や全探索みたいな苦手問題が出なければ3問解きたいね

A - Colorful Slimes 2

 N \leq スライムの色数なので、色を変える時は未出現の色にすると決めておけば、色を変えたスライムは必ず両隣と色が一致しないことになります。
後は、連続したスライムの数に応じて何体色を変えるか考えてみましょう。
連続したスライムの数をLとすると、Lが偶数の時は半分だけ色を変えれば大丈夫です。
逆にLが奇数の時は2番目のスライムから1個飛ばしで色を変えれば大丈夫ですね。
ということは、どちらにしろ\lfloor \frac{L}{2} \rfloor体の色を変えていけば大丈夫です。
後は先頭から順に変えていく数を確定させればO(N)で求めることができます。

B - rng_10s

まず、制約が大きいのでそのまま愚直にシミュレーションすることはできなさそうです。
そこで、例えば今在庫がxyを用いてBx+y (0 \leq y < B)本ある時、x日後にはy本になることは自明ですよね。
ということで、Aに関してBより大きいなら\mod Bしておきましょう。
注意点として、A < Bならそもそも初日に購入できないのでNoを返す必要があります。
次に、D本の在庫を仕入れる時も同様に考えると、Dに関しても\mod Bできることが分かります。
更に、B \leq Cの時も売り切れる前に確実に仕入れられるので、D < Bでない限りはYesになることが分かります。
また、D < Bならどう考えても在庫は減る一方なのでNoであり、ということは考える必要があるのはC < Bのみとなります。
ここまで見ると、全ての変数がB以下になりましたね?
ということは、\mod B上で全て考えると上手くできるのではないかという推測が立てられます。
さて、この時に実際にどうなるかを実験してみましょう。
9 7 5 9についてmod 7上で考えると、
2本→4本→6本→-1本、これはNoですね。
14 10 8 12について考えると、
6本→0本→2本→4本→6本、以下ループするのでこれはYesです。
さて、このループに関してどうなるか更に検討してみると、次のようなことが分かります。

  • 最初の本数をA \mod Bとすると、(A + Dx) \mod Bの本数でループし、その値の中にCより大きくBより小さい値が存在するとNoになる

この時、拡張ユークリッド互除法の考え方を用いると、(A + \gcd(B, D)) \mod Bの全ての値を取ることができると分かります。
後は式を細かく調整すると、B - \gcd(B, D) + (A \mod \gcd(B, D)) \leq CならばYesになることが分かります。
つまり、纏めると以下のようになります。G = \gcd(B, D)であり、A \% B = A \mod Bとします。

  •  A < BならばNo
  •  D < BならばNo
  •  B - G + A \% G > CならばNo
  • それ以外はYes

ユークリッド互除法の計算量はO(\log N)なので、つまりO(T \log B)程度で解くことができます。

結果

ooxx-- 2完(800点) 33:25-29:30 / 29:30
337位 パフォーマンス: 1992
レート: 17211752(+31)

感想

C問題にまさかの全探索が出てきたため、終了が見えたのが残念
制約条件を見た瞬間にbitDPと半分全列挙を疑い、DPが不可と分かった瞬間に半分全列挙は分かった
分かったが……実装できず
やはり全探索の問題は解ける気がしない……