2026年1月3日土曜日

Educational Codeforces Round 186 (Rated for Div. 2)

 Eまで。終了後F1は通った、と思ったらシステムテストで落ちた。

コンテスト後のツイート

F2. Christmas Reindeer (hard version)

 自力AC。見直したら難しくなかった。

 各桁について、何個使うのがギリギリなのかが分かるので、ギリギリのときと、それ以上が確定したときに分けてDPしていく。ギリギリのときは何個使えば良いか? が分かるので、それより大きい個数を使うときは確定。同じ個数を使うときはギリギリ。二項係数で計算する。
 これも桁DPの一種といって良いかな。

 コンテスト中、30分残っていたら解けて良かった気もするけど、問題把握に結構時間かかってしまったなぁ。


2026年1月1日木曜日

yukicoder contest 286

 Cまで。


No.1425 Yet Another Cyclic Shifts Sorting

 自力AC。
 二種類あれば隣接要素SWAPができそうなので、答えは高々2。0回の判定は簡単なので、1回でできるかどうかを調べれば良い。

 一回でできるかどうかは、ソートした配列と比較し、最大値が一致していれば消していく。
 残った配列について、ソートしたものを巡回したものになっていれば良いので、ローリングハッシュを使って判定した。

 が、解説を見たらもっと簡単にできたらしい。なるほど。

 ところで、なぜタグが「動的計画法」なのだろう? 解けたと思った後タグを見たらそう書いてあって、何か間違っているのでは? と疑心暗鬼になりながら実装した。
(タグに頼るのはいけないかもしれないけど、yukicoderのタグはいつも出したまま問題を考えています)

2025年12月29日月曜日

Good Bye 2025

 Eまで。

コンテスト後のツイート


F. Conquer or of Forest

 コンテスト中に考えていた方針でAC。

 まず、白いnodeと親nodeを切る。
 そして、それらを一列に並べれば条件を満たす。(どのnodeからどのnodeへ繋いでもOK)

 結構人工的な条件なので、そこから何かを考えようとするのではなく、それっぽい必要条件を探すのが大事だった。
 一列に並べた結果、問題文の条件を満たす証明は分からないけど、それっぽくはなっている。

 コンテスト終盤にこの条件では? と思ったが、数え上げが間に合わなかった。

・ROOT以外の連結成分について、どの頂点を親と結ぶか
・葉以外の連結成分について、どの頂点を親にするか
・ROOTと葉以外の連結成分について並び替え

 を掛け合わせればOK。
 三番目がよく分からず時間切れ。
 (連結成分数)!みたいなのがいるとは思ったのだが、(連結成分数-2)!だったとは。落ち着けばできたと思うけれど、この条件自体が正しいという確証もないこともあり落ち着けなかった。




2025年12月26日金曜日

ユニークビジョンプログラミングコンテスト2025 クリスマス(AtCoder Beginner Contest 437)

 Fまで六完だがEに手こずった。

コンテスト後のツイート

G - Colorful Christmas Tree

 解説放送を見てAC。

 コンテスト中、フローは少し考えたのだが、使い方が分からなかった。

 次数を見れば最終的に何の色になるか分かるとは思ったが、その間の色を全部使うと気付けなかったのが敗因か。それに気付ければ自力でフローに思い至れた可能性はある。



2025年12月17日水曜日

yukicoder contest 490

 Gのみ解いて撤退。


No.3391 Line up Dominoes

 一応自力AC。
 DPで解く。DPで遷移したときの要素は区間和になることが分かるので、毎回累積和を取って流し込んだ。
 PyPyだとMLEになってしまったので、RUSTに直してもらいAC(コンテスト中だとできないが……)。
 解説を読むとPyPyでも普通にACできるようなのだが、よく分かっていない。

No.3392 Count 23578 Sequence

 自力AC。
 階差数列を考えると、回文の個数を数える問題に帰着できるので、Manacherを使って解ける。
 しばらく気付けなかったが、階差数列を考えると気付けて良かった。

2025年12月15日月曜日

AtCoder Beginner Contest 436

 Eまで。Fが解けずダメでした。

コンテスト後のツイート

F - Starry Landscape Photo

 使う数字の最大値を考えると、それ以下の数字は全て使い、それより大きい数字は消えている。
 なので、使う数字の最大値が大きい順に考えて、一つ一つ消していけばOK。

 コンテスト中は、左端を固定したり、DPを考えたり、使う数字の最小値を考えたりしていた。
 使う数字の最小値を固定する方針にしばらく時間を使った後、最大値を固定する方針も考えたはずなんだけど、なぜか上手くいかない気がしてしまった。
 今見ると、難しく思えないのだが……。なんで解けなかったのか分からない。

G - Linear Inequation

 解説放送を見てAC。

 形式的ベキ級数を使うと聞き、立式まではできたつもりだったのだが、1+x^a+x^(2a)+...をM次の項までで打ち切るなどと考えてしまったのがダメ。
 1+x^a+x^(2a)+...と無限に続くもの同士の積と考えるべき。

 そして、さらに重要なのは、「そのM次以下の係数の和」を、Aに1を付け加えることで、M次の係数と解釈できるようにするところ。全く思いつかなかったが、形式的ベキ級数に慣れている人にとっては典型なのでしょう。

 あとは、Bostan–Mori法を使って処理すればOK。久しぶりにこのライブラリを使う機会と出会った。

 形式的べき級数にもっと慣れないとダメですね。






2025年12月14日日曜日

Codeforces Round 1070 (Div. 2)

 Dまで。

コンテスト後のツイート


F. Omega Numbers

 滅茶苦茶苦労したが、WAを量産した一番の原因が、200000を20000と書き違えていたことだというね! これで二時間以上使っているのひどすぎる。

 解法自体も難しかったが、必ず身に着けておくべきなのは、
「数列Aにおいて、約数がxになるような(A_i,A_j)のペアの個数」がカウントできるということ。それができたとしても難しいのだが、後は自力で思いつくべきなのだろう。