2026年1月18日日曜日

AtCoder Regular Contest 182

 ABの二完だが、レートは上がった。

コンテスト後のツイート


C - Sum of Number of Divisors of Product

 解説AC。
 積の和典型の練習をしようと思って解こうとしたが難しく、解説を読んでもしばらく理解できず非常に苦労した。

 公式解説のように積の和典型を適用すると、タワーと積み木の問題と同等になることは分かる。しかし、それがbit DPで表せることが分からなかった。(ChatGPTに聞いたりしつつ悩んだ)

・どこかで積み木を選ぶのだから、積み木を置いたそのときに選べば良い

 と考えると理解できた。
 たとえば、「6」の積み木を置くとき、それは、2と3の位置に積み木を一個ずつ選ぶことを意味する。
 そして、それまでに2の位置や3の位置の積み木を選んでなかったとしたら、このときに選べば良い。
 その、既に選んだかどうかでbit DPをしている。

 また、最初に積み木が一個ずつ置いてあり、それを選んでも良いので、bit DPの初期値は全て1になる。

 こういう考え方でDPを書いたものが、この提出。これを行列累乗で高速化するとACできる。



2026年1月16日金曜日

Codeforces Round 1072 (Div. 3)

 ACの二完。Bで詰まって一旦離脱して、最後に戻ってきてもう少し解こうと思ったけどDが間に合わなかった。


B. Hourglass

 難しくないか?
 mを2*kの余りとした後、sとkの大小で場合分けして考える……という方針は簡単に立つけれど、s=kやm=kのときどうなるか? など注意すべきところが多い。
 コンテスト後にも2ペナを出してしまった。

E. Exquisite Array

 自力AC。
 差が大きい順に見て、Union-findで要素をつなぎ、答えを更新していく。しばらく思いつかず結構時間がかかってしまった……。

F. Cherry Tree

 自力AC。mod 3での可能な回数の集合を持って木DP。
 この解法はmod 3だからできたもの。maspyさんの解説によると、modが任意の場合にもできるらしいが理解できていない。

G. Nastiness of Segments

 自力AC。セグ木+二分探索。問題文がやや難読だが、内容は簡単だった。

 結局、Bが一番難しい回だったみたい。

2026年1月14日水曜日

AtCoder Regular Contest 212 (Div. 2)

 ABDの三完。

コンテスト後のツイート

C - ABS Ball 

 解説放送を見てAC。

 積の和典型と言われても全然ピンと来ないし、積の和典型の解法自体も忘れているしで全然ダメでした。

 というか、最初この問題を見たとき、積の和典型を使うのでは? と思ったはずなのに、苦手意識があるせいか、そう思ったことを忘れてDPを考えていたのもダメ。もっと練習した方が良さそう。







2026年1月13日火曜日

AtCoder Beginner Contest 440 (Promotion of Engineer Guild Fes)

 ABCDFの五完。

コンテスト後のツイート

E - Cookies

 コンテスト中に書いていた方針でAC。
 コンテスト中、例題を解いた経験があると思ったが、実際正しかった(どの問題かは探せなかったけど)。そして、Aを降順にソートして、[K,0,0,0,0]からはじめて、一つずつずらしていく探索をすれば良い……という方針もできていた。

 ただ、コンテスト中は、Kの値が大きいことに混乱して、[K,0,0,0,0]のような配列で扱えると気付かず、Counterを持ち出していた。そのため実装でCounterのhashを求めなければいけなくなったりし混乱。
 そして、hash値を求めているのにその値を使い忘れたり、値が0のときはじくのを忘れたりしてWAが取れぬまま終了した。

 コンテスト中は混乱して、正しいことを書いているのか分からなくなっていたけど、落ち着くことさせできればコンテスト中に通すことも可能だった気がする。






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のタグはいつも出したまま問題を考えています)

No.1426 Got a Covered OR

 解説AC。
 A_iが全て正、という条件の扱い方が難しい問題。

 包除原理で扱うのかな? とは思ったものの、DPで包除原理でやるのかと考えてしまってダメだった。

・範囲を分割できること
・それぞれの範囲について、二項係数を使って計算していける

 ことに気付ければ解ける。
 bitの中で条件を満たさないものの個数で包除すれば良い。

 方針が分かれば難しくない。何で包除すれば良いかを考えるのが大切だった。

No.1427 Simplified Tetris

 解法は自力で分かったが、ACするのは苦戦した。

 盤面が与えられたとき、ちゃんと置けるかどうかは、この問題と同じ。
 なので、元の盤面の候補を全探索したい。

 ブロックが入っているマスの前後に何マスあるか? をDFSで調べれば良さそうだが、何列必要かが分からない。高々2列で十分だろう、と思ったらWAで、3列必要な場合があった。

 そして、それで全探索するとTLEしてしまったため、ずるいけれど時間で打ち切る処理を入れてAC。

 解説を見ると、もっと上手にやる方法が書いてあった。気付かなかった。

2025年12月29日月曜日

Good Bye 2025

 Eまで。

コンテスト後のツイート


F. Conquer or of Forest

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

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

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

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

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

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