2026年10月6日火曜日

AtCoder Regular Contest 231

 Bのみ一完。それも遅い。

コンテスト後のツイート

A - Two Dimensional Invader

 解説放送を見てAC。

 言われてみればなるほど。x座標とy座標を分けて考えるという発想はあったが、思いつけなかった。
 BITは「更新O(logN)区間取得O(logN)」ですが、これは普通にやった場合「更新O(1)取得O(N)」、累積和を使った場合「更新O(N)取得O(1)」の中間あたりを取っていると考えられる……みたいなのと似ている。

 O(N^2)をO(N)とO(N)に分解することもそこそこありそうなので典型的とは思うけど、一問目でパッと見て思いつけるものでもないねぇ。Bがスムーズに解けて、落ち着いて臨めたら違った可能性はあるかなぁ。

2026年9月24日木曜日

AtCoder Regular Contest++ 230

 一問も解けず。

コンテスト後のツイート

A - Meeting on Tree

 解説を読んでも式変形が理解できず、ChatGPTと相談して式変形を理解し、AC。

 技巧的で難し過ぎるが、

・minは扱いにくいので、minのない形へ変形する
・Σの中に二項係数の積があるときは、Vandermondeの畳み込みの適用を疑う

 といったあたりを押さえていれば解くのは不可能ではないかも?

 ただ、そもそもVandermondeの畳み込みという公式を知らなかった(覚えていなかった)のでコンテスト中は解きようがなかった気がする。

 いやぁ……。
 一応たくさん解かれているから、自力で解くためにはどうしたら良かったのだろう? と考えてみたけど、正直なところ、式変形を追うことは一応できるけど、自力で導出するのは不可能なレベル、と思えてしまう。
 このタイプが頻出問題なら、似た問題を短期間に十回とか解けばできるようになるかもしれないけど(それでも一年後には解けなくなりそうな気も……)、そういうこともないからなぁ。

2026年9月23日水曜日

Codeforces Round 1122 (Div. 3)

 Eまで。Dから難しい……。

コンテスト後のツイート

F. MEX Replacement

 苦労したけど自力AC。

 答えを二分探索する。
 MEX xを作りたいなら、[0,x-1]が全て1個(以上)必要。そのためには、[0,x-2]まで全て2個必要、と差がsaならpow(2,sa)倍の個数必要になっていく。
 そして、余ったものは、0に変えて使うことができる。
 これらを使うと、自分以下のそれぞれに必要な個数が何個か、というのを持って大きい方からシミュレーションしていく(それがあまりにも大きくなったらその時点でダメ)ことで、「あるxを作れるか?」という判定問題が解ける。

 答えで二分探索して大きい数字から見ていけば解けそう、という大まかな方針が分かった後も実装に苦戦。なかなか難しい問題という気がした。
 






2026年9月16日水曜日

Codeforces Round 1121 (Div. 2)

 Dまで四完。レートが上がったが、昨日の大失敗を取り返すことはできず。

コンテスト後のツイート

E1. A Prime Flood (Easy Version)

 Aの最小値、最大値が分れば、f(A)の値は求まる、ということはコンテスト中に分かっていた。
 DP[最小値][最大値]とDPすれば、fの値を求めることができるという情報を見てAC。

 確かに、言われてみればDPできるが、コンテスト中は全く考えなかった……。
 Easy versionの制約がn<=3000である理由を追求するべきでした。



2026年9月15日火曜日

AtCoder Heuristic Contest 071

 187位。
 最初は焼きなましを考えていたが上手くかず。方針転換しこの解法を思い付いたときは割と筋の良い貪欲を思い付いたと思ったが、実際はイマイチでした。

コンテスト後のツイート

 上から置き方を確定させて良い、とは気付いていたのに、実際の解法に生かせなかったのがまずかったか。
 分割してDPとか、上からビームサーチなどという解法が流れてきて、確かに……という気持ちになった。



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に整理してもらったもの)

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


AtCoder Beginner Contest 475

 F分からず、G間に合わずで五完。

コンテスト後のツイート

F - Rectangle Filling

 解説放送を見てAC。
 「Bounding Boxを見る」を全く思いつかなかった。色を塗る長方形で、一番上(下左右)の辺が全部#だと縮めて良い、ということには気付いていたのだが。

 F飛ばしたのは正解でしたね。

G - Has Many Divisors

 コンテスト中の方針でAC。
 最初の素数いくつかのベキを決め打ち、それ以降の素数を高々一個できるだけ使う感じでやった。
 コンテスト中は、実装ミスで、決め打った素数と一個ずつ順に使う素数の間に使わないものがでていたりしたのがひどかった。そういうミスがなかったとしてもTLEとの勝負があったから通せてたかは分からないけど、惜しかったねぇ。
 F飛ばした判断自体は間違ってなかったと思う。
 



2026年9月8日火曜日

AtCoder Beginner Contest 474

 F解けず六完。早めにGに行ったおかげだけど、レートが上がって嬉しい。

コンテスト後のツイート

F - Increment All Divisors

 自力AC。

 コンテスト中の方針で、判定方法を変え、三分探索にしたらACできた。
 判定方法は、「揃えたい数字との差の絶対値、の和」これが最小になるものを探した。

 凸性は示してないけれど……。
 公式解説を見ると、一次式の和であることを利用して解いている。これなら凸になりそう?(分かっていません)





2026年9月7日月曜日

AtCoder Regular Contest-- 229

 ACDEの四完。

コンテスト後のツイート

B - Halving Subtraction

 解説AC。

 全く考えていない方針だったのでびっくりした。
 Nが小さいからシミュレーションみたいなことをするのでは? という方向性でしか考えられなくなった時点で負けている。
 全ての要素を0にすることは可能か? と考えて必要条件で絞っていかなくてはいけなかったが、一旦まずい方針にハマると難しかった。

F - Angst for All Pairs 2 

 自力AC。

 実験すると、(コストが最大の)一枚を除いて他の全てのカードについて、複数毎あるか、複数枚あるものとペアか、どちらかであれば良いと分かる。
 複数毎使うカードを全探索すると、コスト計算は累積和を利用すれば計算できる。

 自分にとってはBより簡単だったけど、実験したりしてそこそこ時間かかっているから、こっちに取り掛かれば解けたという気はあまりしないねぇ。


2026年9月4日金曜日

AtCoder Talent Quest 〜 今から28卒には脱出してもらいます〜予選(AtCoder Beginner Contest 472)

 Gが解けず。

コンテスト後のツイート

G - Cascading Grid

 「燃やす埋める」だと聞いても解法が分からず、けんちょんさんが最近出した記事を読んでAC。
 が、この記事の解法通りの方法は思いつけず、グリッド中の、#でない最も左端の頂点だけを取り出し、そこから左右だけを見たときのスコアの増減を見て、その頂点同士の木構造を調べて、ようやく燃やす埋める問題に直せてACできた。

 その後、けんちょんさんの解法も理解してACしたけど、その実装にも苦戦。

 「燃やす埋める」の中では簡単な問題と書いている人もいたが、個人的には簡単に思えなかった。もっと慣れたら違うのかなぁ。

2026年8月31日月曜日

AtCoder Regular Contest++ 228

 一問も解けずおしまい。しかし、Bは解けなくてはいけない問題だった。

コンテスト後のツイート


B - Minimize Topological Order

 コンテスト中の方針でAC。
 値を変更したらセグ木の更新を二ヶ所しなくてはいけないのに、一ヶ所しかしていなかったせいでした。

 最初にとりあえず一列に並べて置いて、後ろの一段を先祖のどこかへ付け替える……と考えていたのがまずかった模様。これだと正当性がよく分からないし、葉から考えるのが自然(?)にも思える。

 根から順番に木を構成すると考えれば貪欲の正当性も分かりやすかった。
 

AtCoder Beginner Contest 473

 久しぶりの全完だが、良い順位とは言えず。

 Dは「最後の一要素を場合分け」が正当であったらしい。確かに、これをすれば無駄な探索を省けるが、こういう枝狩りみたいなのを要求されるると思っていなかったため、思いついた後も正しい解法とは思えなかった。

コンテスト後のツイート





2026年8月21日金曜日

JPRSプログラミングコンテスト2026#2 (AtCoder Beginner Contest 470)

 既出に気付けたおかげで、久しぶりに2400パフォを獲得。全完チャンスだったねぇ。

コンテスト後のツイート



E - Concentration

 自力AC。
 DP[x毎既知][y毎取得][z消費ライフ]とする方針で合っていた。

 コンテスト中は、y枚取得しているとき残っているカードの枚数をN-yにするのを忘れて、yのまま計算していたため答えが合わなかった。
 これくらい気付いて欲しいものなのだが、今(コンテスト後)にコードを見直したときも気付けず、デバッグ出力を行って気付けたので、コンテスト中に気付けないのは仕方ないのかなぁ。

2026年8月18日火曜日

AtCoder Regular Contest 227

 AB二完。

コンテスト後のツイート

D - Median of Binary Strings

 解説放送を見てAC。

 全く思いつかなかったのでどうしようもない。なかなか天才的な発想が必要だった。
 これはコンテスト中に解けた気がしないので、他の問題にいくべきでした。







2026年8月14日金曜日

ユニークビジョンプログラミングコンテスト2026 夏(AtCoder Regular Contest 226)

 Bまで二完。

コンテスト後のツイート

C - Square Corner Packing

 自力AC。
 ツイートに書いた解法であっていた。HかWが偶数の場合は愚直で良く、(4n+1)*(4n+1)の最大の正方形を入れて、あとは愚直でOK。

 が、実装は大変だった。10分ではとても実装終わらず。早く実装できている人は凄いなぁ。

2026年8月3日月曜日

AtCoder Beginner Contest 469

 E解けずABCDFの五完。

コンテスト後のツイート

E - Pro Exam Eligibility

 キーワードを見てAC。解けなくてはいけない問題だった。

 二分探索だと思ったものの判定問題が解けなかった。
 これは「oとxに上手く値を振り分ければ」連続部分列の和が0以上になるか? という問題になり解ける。

 「oとxに上手く値を振り分ければ」の部分、最近だとこの問題で同じようなことをやっていて、このときは解けている。しかし、実数値を振り分ける問題は見たことがなく、頭が働かなかったのだと思う。
 


2026年7月20日月曜日

AtCoder Regular Contest 225

 Dまで四完。Cでバグらせたのが敗因。

コンテスト後のツイート

E - Gap Swap (hard)

 解説AC。

 実験しなきゃ思いつかなかったと思うけど、実験する時間もなかったし仕方なかったか。
 近くの場所へ移動させる貪欲は思いついていたけどねぇ。

2026年7月18日土曜日

Codeforces Round 1108 (Div. 2)

 Dまで。

コンテスト後のツイート

E. lce4113 and Security Game

 maspyさんの解説を読んでAC。

 コンテスト中に、o(v, x)=xのとき以外は簡単なことは分かっていた。そして、こちらができることは、xのbitcountを何個選ぶか? くらいしかなく、それも、一個にするか半分にするか? くらいしか選択肢はない。

 しかし、つい半分くらいにするのが最善かな? と考えてしまいダメだった。
 方針転換して一個の場合を追及すれば答えに辿り着けた気もするけど、意外と思いつきにくいし、詰めるのに時間がかかりそう。

2026年7月17日金曜日

AtCoder Regular Contest 223

 Cまで三完。三完の速解きにはまあまあ成功したが、DやEで迷走した。

コンテスト後のツイート


D - Xpectation of Cards in Hand with Laboratory

 解説放送を見てAC。
 経路数とか鏡像法とかいうキーワードを見てもピンと来ずACできなかったので、コンテスト中のACは遠かった。

 やることは、
・ドローカードをx軸、普通のカードをy軸としてプロットし、どの経路を計算するかを調べる。
・鏡像法で計算

 というだけ。

 ただ、そもそも、問題文では全てカードを区別しているのに、カードを区別しなくても良いの? というところから詰まった。
 これは、
・A_1 A_2 B_1 B_2 A_3
 という区別した順列に対して、
・A A B B A
 という区別しない順列を考えると、どんな区別しない順列に対しても、区別する順列はA、Bの並び替えA!B!通りを掛けただけ存在することから分かる。


 また、経路数を求めた後、使っていないA、Bの並び替えを掛けなくてはいけないことにもなかなか気付かなかった。

2026年7月16日木曜日

Codeforces Round 1109 (Div. 3)

 Eまでしか解けずひどい順位に。

コンテスト後のツイート

F. Anya Loves Trees!

 コンテスト中は何かの実装ミスかと思っていたが、考察が間違っていた。

 あるノードの子の番号たちが、(9が最大だったとき)

・8 9 1 2

 のように、一つながりになっていたら良いと考えていたが、これだと最終的にぐるっと連番になることはできたとしても、1をスタートにできない!

 なので、一番小さい数字から初めて、全て連番になっているようにしなくてはいけない。

 番号が連続になっているかどうかを判定するのには、左右を管理するやつを利用した。

G. Yura and Deadlines

 解説AC。

 条件が、iの条件とjの条件の&に分解できるので、iの条件についてセグ木を使ってやりながら、イベントソートでjの条件を処理する。

 これはFよりはっきり典型的で優しく、解けなくちゃいけない問題だった。
 Fの勘違いは仕方ないところもある。とはいえ、F解けなくて動揺していたとしても、こういうのは取らないと。