2023年9月18日現在、A/B 問題全踏破完了。引き続き C 問題でネタ集め&順次更新中。
このレート帯での本命は C/D 問題です。
AtCoder 記憶に残っている問題集
自分と同じ緑コーダーくらいの人向けのイメージ。自分自身も過去 ABC マラソンしながらネタ増やしていきます。
「しばらく間を空けてからでも忘れないよう復習しときたいと思えたかどうか」「記憶を消してもう一回チャレンジしたいと思ったか(解いてて楽しかったか)」を判断基準にしています。ただ面倒くさいだけといったものは載せません。
★マークはその難易度帯における学びの大きさ(主観)
- AtCoder(本家)
- AtCoder Problems(これとにらめっこしながらお楽しみください)
- AtCoder のテストケース(どうして WA なのか分からない時に)
- https://qiita.com/drken/items/fd4e5e3630d0f5859067
ABC-A
論理的思考とパターン整理
ABC313-A(★)
ヌケモレないかきちんと考えよう。
ABC263-A(★★)
ソートした時の法則性を見つける問題はけっこうあります。
ABC261-A(★★)
いきなり図形的な考察を求められるので手が止まる。答えが 0(離れている)でない場合は、包含されている場合・交差している場合を問わず、 右端の小さいほう-左端の大きい方 min(r1, r2) - max(l1, l2)
が答えになることを頭の中でイメージできるか。
ABC249-A(★★★)
設問はシンプルなくせに A 問題にしては鬼難易度。実装量もボリューム大き目。丁寧に考えないとハマるし、A 問題においておくとトラウマになる。
ABC227-A(★★★)
シンプルですが添字の扱いを間違えるととんでもなくドツボに。地味に良問だと思う。
アルゴリズムとデータ構造
ABC273-A(★★★★)
いきなり数式が出てくるので、面食らう人は面食らう。今後鬼門になるであろう DP への布石として、 $f(k)=f(k-1)...$ といった関数表記の実装に慣れておきましょう。
ABC159-A(★★)
\displaystyle {}_n C_k = { n \choose k } = \frac{n!}{k! (n-k)!} = \frac{{}_n P_k}{k!}
こんな公式覚えていなくても $\displaystyle {}_n C_2$ なら直観的にわかるように。
知らないと手が止まる
ABC274-A(★)
round()
じゃダメっぽいのは知ってるだけど、四捨五入ってどうやるんだっけ…と。f-string したいけどゼロ埋めの表記方法忘れてしまったよ。
ABC213-A(★)
xor のビット演算子なんて普段使わないから覚えてるわけない。※Python には & \| ^ ~ << >>
の5つのビット演算子があります。
ABC-B
発想力
ABC313-B(★★★)
最初、itertools
の permutations
で全順列をリストアップして可能性のないものをツブしていくという力業で提出したら、全 26 テストケース中 ACx7 TLEx19 という笑える結果に。$2 \leq N \leq 50$ 見てなかったよー。
どうしてもわからずに公式解説行き。なんでこれで完全に説明できるのかいまいち分からないままモヤモヤして終了。「全ての情報が正しくなるように、全ての相異なる 2 人組にどちらが強いかを割り当てる方法が少なくとも 1 通り存在する」という制約が大切なんですよね、きっと。
ABC302-B(★★★)
愚直に全サーチすれば良いのだけれど、あらかじめ 8 方向の (dx, dy)
を用意しておいて、全地点で 8 方向走査かけていく…と。盤面系でよく出てくるイディオムですね。
ABC264-B(★★)
チェビシェフ距離・・・ごめんなさい、思いつきませんでした。$\max(\lvert dx \rvert, \lvert dy \rvert)$ ってよく考えればその通りなんだけど。ABC180-Bがまとめです。
ABC255-B(★★)
これはつまり何を求めればよいのか気付かないと手が止まったままに。
ABC195-B(★)
難しい。どうしてそうなるのか最後まで分からなかった…。
ABC060-B(★)
整数のお話、こういうの苦手です。
論理的思考とパターン整理
ABC310-B(★★)
同じ機能でもっと安いのないかな?値段同じならせめてちょっとでもいいものを!って現実的にも業務の実務的にもありそう、なんか楽しい。set
の使い方に慣れるためにいい。
ABC295-B(★★★)
盤面読み込み系の問題は今後再頻出になるので必修です。この手の問題は、ゲームをクリアした感が強くて大好き。Rogue好きとしてもたまらん。
盤面をリストとして読み込むイディオムはよそ見しててもかけるようになっておきましょう。
ABC272-B(★★★★)
難しいアルゴリズムは何も要らないのに、色々詰まっていて良問だと思う。B 問題ってこういうのがいい。設問の設定もそれっぽいし。
ABC265-B(★)
あくまで素直でまっすぐな問題がいいですね。
ABC262-B(★★★)
色々応用問題。隣接リスト作ったのはいいけど、ここからどうしよう・・・と一時停止してしまった。トレビアンな解法があるのかと、ドキドキしながら解説を見たらそんなこと全くない。まっすぐ全検索だ。B 問題にしては難易度ちょい高め?
ABC258-B(★★★★)
最初、途中でも自由に動けるものと勘違いして $O(8^n)$ をどうしようか小一時間ばかり悩んでしまった。よくよく考えると自由に動けてしまったら最大値は、最大数とと周辺最大数のジグザグ往復であることが自明だったりしてヘコんだりと色々ありました。結論:問題はきちんと読みましょう。
いずれにせよ、B 問題の中では相当難しめ。どころか歴代 B 問題の中で最高難易度に近いと思う、実戦でこれが 2 問目にやってきたら涙目必至だわ。
ABC197-B(★★)
突如重いのが来てびっくりする。この周辺の B 問題と比較すると格が違うような。
ABC194-B(★★★)
頭の中でパターン整理するのが気持ちいい。min()
と max()
でキレイに書きたい。
ABC107-B(★★)
ABC197-Bといい、B 問題でやってくる盤面読み込み系は単純に面倒なのが多いような…。イラっとせずに愚直にいこう。
ABC087-B(★★★★)
ループ最適化の分かりやすい練習問題だと思う。制約も緩いので全探索だけど、二重ループでいこう。
ABC075-B(★★★)
盤面読み込みマインスイーパー。
ABC070-B(★)
線分の重なっている部分を求める問題は今後頻出。ABC261-Aと同じ問題。min(右端)-max(左端)
、重なってないと負の値。
ABC054-B(★★)
盤面読み込み系、クソ面倒・・・。
アルゴリズムとデータ構造
ABC280-B(★★★)
メモ化(DP)の練習。この程度の制約であれば、何も考えずに書いても AC
できる。
ABC276-B(★★★★)
グラフ問題で隣接リストを作る練習。これ知らないとここから先には進めないので必修。私は g = {i: [] for i in range(1, n + 1)}
な感じで dict
の入れ物を作ってしまいます。list
にするのか、0 オーダーにするのか・・・などいつも迷うのですが、結局これが一番応用が利く気がする。
ABC006-B(★★★★)
漸化式とデカすぎる数字に慣れる練習。
全探索(計算量)
ABC299-B(★★★)
問題は簡単なんですが、何も考えずに enumerate
でリスト内包表記をズラズラ並べていたらまさかの TLE。$2 \leq N <= 2 \times 10^5$ を 2 sec. 以内っていうのは意外と意識しなきゃいけないレベルなんだと知った。zip
って素敵です。いぶし銀的良問か。
ABC293-B(★★★★)
呼ばれたことある人リストを作ってループの中で毎回 in
走査してしまい初回 TLE
。in
って便利だし脊髄反射で書いてしまうけれどもこれだけで $O(n)$ のコストがかかることを意識しなければ。
$N \leq 2 \times 10^5$ を二重にするとそりゃ TLE
しますわな・・・って計算量を意識しはじめるための良問だと思う。buf = [False] * n
って書きにくいんだよなあ。スマートじゃないというか、メモリケチケチ病が身に染みてるというか。
ABC251-B(★★★)
自由すぎて、あちこちに工夫の余地がある。何も考えないと当然 TLE
。こういうの苦手。
ABC228-B(★★)
また制約をよく読まずに $10^5$ ループの中で in
使ってしまった…。ABC293-B と同じ轍。
知らないと手が止まる
ABC273-B(★)
毎度おなじみ四捨五入。Decimal.quantize
の使い方を調べなくてもよいように、「対象のケタを小数点第一位に配置し、2倍して1足して2で割る」です。逆にこれじゃダメなパターンが分からない、丸め誤差が発生するケースがあるのかな。
ABC259-B(★)
いきなり無茶を言わないでくださいという感じ。回転行列調べるしかなかったわな。
\begin{bmatrix}
x' \\
y'
\end{bmatrix}
=
\begin{bmatrix}
\cos(\theta) & -\sin(\theta) \\
\sin(\theta) & \cos(\theta)
\end{bmatrix}
\begin{bmatrix}
x \\
y
\end{bmatrix}
x'=x\cos(\theta)-y\sin(\theta) \
y'=x\sin(\theta)+y\cos(\theta)
ABC189-B(★)
割り算に注意。
ABC-C
bit全探索
ABC190-C(★★)
問題文がとっても読みにくいけど、普通にbit全探索して全通り計算してみるだけ。$2^{16}=65536\fallingdotseq10^6$ なので、その内側で $10^2$ を回してもギリ OK かな…とか妄想して実装。
bit全探索っていうのは文字通り全探索なので、計算量はあくまでも $O(2^n)$ ベースってことを忘れずに。
ABC167-C(★★★★)
問題設定も分かりやすいし、bit全探索基本おさえのお手本問題のような感じ。最終出力が最小金額だったりするので、理解度集計のたびに使った金額の小計も取っとかなきゃならなくてちょい面倒。
だけど実務プログラミングではこういうケースの方が多かったりするし学びは多い。
ABC045-C (ARC061-C)(★★★★)
bit全探索の基本練習。ABC079-C も全く同じ。詳細は こちら をどうぞ。
全探索(計算量)
ABC112-C(★)
シンプルな全探索なんだけど、細かいひっかけポイントがいくつかあるので注意。問題文のテストケースはすんなり通り、意気揚々と提出したら 1 つだけ WA
して頭を悩ませるパターン(俺だ)
ABC095-C(★★)
ループ回す対象を工夫すれば全探索の計算量を最適化できるシンプルな例。何かが決まると、残りの要素はおのずと確定するので検証不要という考え方に気付く練習。$O(n /2)$ でいけそうです。