見出し画像

緑コーダーになるのに、精進はいらないという話。

おはこんばんにちは!Atcoder緑になったウルズニャーです。

私のAtcoderプロフィールはこちらから。

2023年12月9日に行われた、Atcoder Regular Contest 169にてAtcoderのレートが800を超え、緑コーダーになる事が出来ました。

私の緑コーダーになるまでの軌跡がかなり特殊な気がするので、入緑記事を書くことにしました。

はじめに

この記事は、「緑もしくはそれ以上を目指す、灰色~茶色の方」向けの記事となっております。

「精進と練習量こそ正義」と思っている方には不快な内容が含まれているかと思いますのでご注意ください。

その上、拙い文章による文脈崩壊が多々発生していると思いますが、それでも良い方のみこの先をご覧ください。


自己紹介します

名前:ウルズニャー
学年:大学2年(通信制)
趣味:競プロ、自作キーボードとその配列カスタマイズ
プログラミング歴:11年(Scratchレベル含む)
競プロ歴:6ヵ月
Atcoder歴:5ヶ月
C++歴:5ヶ月
数学歴:数オリ対策中3までやってました。

競プロを始めたキッカケ

大学の先生にICPCを進められ、ノリと勢いで大学の先輩を誘って、出場までの1ヵ月間ICPCの過去問を解いてました。
(この時はC++じゃなくてノーマルCでやってた)
この時にドハマりして、ICPC終了後からAtcoderをジャンジャンやるように。

うん。まぁ、自己紹介はそんなもんかな?

緑コーダーになるまでにやった事

Difficulty Pies
ABC Pies

上の画像の通り、私が累計で解いた問題数は、半年間で130も行きません。
EDPC、高校生のPCK、私が競プロを始めたキッカケでもあるICPCを合わせても、150は行かないでしょう。

これは、緑コーダーになってる人の中では、かなり少ない方ではないかと思っています。

じゃあ何をして緑コーダーになったのか?

影響が大きかったと思う順に挙げたいと思います。

  1. コンテスト時間中に読んだ問題で、解けなかった問題の直しをする。

  2. 直しの時に、少しでも希望を感じるなら、解説ACをせず自力ACをする。

  3. 自力ACした問題も、解説を読む

  4. ARCに積極参戦する。

  5. 時間の都合で参加できなかったABCには必ずバチャ参加する。

どういう意図なのか説明していきますと、私は早解きの事をそんなに意識する必要はないと思っています。
緑になるのに必要な能力って、「4問をまあまあな頻度で解く能力」なので、3問を早くする事より、4問目をクリアする事の方が大事だからです。

そのための施策が上の5つになります。

まず、1つ目。
解けなかった問題を取る事について。

取れる問題数を増やすためには、出来ない問題を出来るようにする必要がありますよね。(当たり前。小泉構文気味w)

だとすると、「ダメだったけど、読んではみた問題」が出来るようになりたいですよね。
ならその問題解ききりましょう。
下の画像、濃い緑の部分がコンテスト時間内、薄い部分がコンテスト終了後に解けたものです。

大体の回で終了後、1問以上解いている事がわかると思います。
(一番下のABC311がAtcoder初参戦回)

AtCoder Problems

次に2つ目。
出来る限り自力ACする理由。

解けなかった問題を自力ACするなんて無理じゃない?と思うかもしれません。

ネット検索、アルゴリズム本、ChatGPTをふんだんに使っても無理ですか?
それでも無理そうなら解説行きましょう。

しかし、無理じゃなさそうなら、本とか見ながら自力ACしてみてください。
その問題の解説を読むと、分かった気になって実装する事が出来てしまいます。
しかし、類題の解説しか見なければ、そんな「分かった気」では実装出来ませんので、一回で、習熟度がものすごく上がります。

もっと言えば、検索慣れすると、「コンテスト中に初めて知ったアルゴリズムでACまで持ってく」という芸当がワンチャン可能になります。

例えば、ナップザックDPと呼ばれる問題。
ABC317-Dで出題され、4時間以上かけて本を見ながら実装し、自力ACしました。
その応用と言うべき問題がABC322-Eで出題され、時間内ACに成功しています。DP実装自体、2度目の実装で、しかも応用なのにです。

更に、少ない問題数をじっくりやるメリットがあります。
それは、問題のナンバーと内容を覚えておけるという事です。
問題番号を覚えていたら、速攻過去のソースコードを見に行き、何をすれば良かったか復習する事が出来ます。

そして当たり前ですが、こんな事をやっていると、1回のコンテストの直しをしていたら、気付いたら1週間経過しています。
だから追加で精進までする必要がないのです。(タイトル回収)

そして3つ目。
自力ACをした後、必ず解説を読むという話。

これは、コンテスト中に解けた問題も含めて、かなりオススメです。
むしろ解説って、解いた問題が、効率良く実装出来ているか?を確認するためのものとさえ思っています。

今も、ABC-AやABC-Bの解説でも、ためになる事がありますし、AC後に解説を読むのは本当にオススメしたいです。
(これは大量精進勢にもぜひオススメしたい事ですね)

さて、まだ触れていない4つ目と5つ目。
ARC積極参戦とバチャコンの話。
これは手短に行きましょう。

ARCは1問解ければ、緑とか水色パフォ出たりします。
0問爆死の恐怖はありますが、その分1問解いたリターンも大きいので、特にレートが低い内はオススメです。
後、数学得意な方もオススメです。

そして、参加しなかった回をやる理由ですが、単なるペース配分です。
1週間掛けても無理そうなら、時間余裕がある時に解説ACしに戻って来るとして、次の週の問題へ行きましょう。

習得したアルゴリズム

競プロer界隈ではなく、私の中の得意不得意で書いて行きます。

◎:得意、自分のレートのDiffならスラスラ書けると思う。
〇:普通に書ける。ギリ時間中に間に合うかな・・・・
△:一回実装した事くらいはある。時間内はまだ無理そう。
✖:名前は知ってる。実装とかしたことない。

$$
\begin{array}{|c|c|} \hline
アルゴリズム & 得意不得意 \\ \hline
二分探索 & ◎ \\ \hline
三分探索 & 〇 \\ \hline
尺取法 & ◎ \\ \hline
半分全列挙 & × \\ \hline
累積和 & 〇 \\ \hline
いもす法 & × \\ \hline
二分累乗法 & 〇 \\ \hline
DP & ◎ \\ \hline
BitDP & 〇 \\ \hline
桁DP & △ \\ \hline
DFS & 〇 \\ \hline
BFS & △ \\ \hline
Bit全探索 & 〇 \\ \hline
ダイクストラ法 & △ \\ \hline
クラスカル法 & △ \\ \hline
ワーシャルフロイド法 & × \\ \hline
ベルマンフォード法 & × \\ \hline
Union-Find & △ \\ \hline
セグメント木 & × \\ \hline
遅延セグ木 & × \\ \hline
ローリングハッシュ & × \\ \hline
マージテク & ◎ \\ \hline
\end{array}
$$

※記載が漏れてるアルゴリズムは、知らないか記載漏れという事でご理解くださいw

入緑当日の話

入緑した、ARC169の話を少し書いて行こうと思います。

うん。言いたい事は分かる。
その週のABCを1週間掛けてしっかり見直そうって話をここまで書いといて、「ARCなんかい!」ってなるよね😅

でも、ABCの問題見直しが活きた結果のものなので、聞いてください!w

コンテスト前の行動

茶色コーダー最後の食事と覚悟を決め、茶色コーダー最後の晩餐宣言をX(Twitter)でしていました。

@Likaf_さん。
パクリすみませんが、すごくモチベになってました。ありがとうございます。

コンテスト結果

ARC169の結果

ARC169は1完65分(A問)という結果で、人生初の水色パフォ―マンスを出して入緑しました。

この問題を解く際に、私はマージテクによる高速化を実施し、ACする事が出来ました。
正直、マージテクを知らなかったら、TLE解法しか浮かばず解けなかったと思います。

そしてこのマージテクを知ったのが、3週間前に解いたABC329-Fだったのです。
その時、マージテクは存在すら知らなかったので、悩んだ結果分からず、解説ACをしていました。

しかし、いきなり解説ACだったら忘れていたと思います。
時間を掛けて解説を見た問題は、しっかり覚えているという事でしょう。

水色になるためにこれから何するの?

まず、Union-Findとセグ木の履修ですかね。
明らかな弱点枠と化してます。

そして、こんな記事を書いておいてアレですが、精進をしようと考えています。

現状、4問目以降は一つに1時間以上掛かる事が多い状態です。
この状態で、5問目を取る訓練をした所で、コンテスト中に間に合う事はありません。
なので、一旦スピード強化に舵を切ろうと思っています。

具体的には、C問とD問をラッシュしたいですかね。
結局時間掛かってるのはCとかDなので、この辺を高速化したい。

まとめ

ものすごく大雑把にまとめます。

・練習は量より質だ。
・早解きに逃げるな。
・毎回解けなかった問題を1つ以上やれ、大量精進はその後だ。
・難しい問題は、類題の解説でも探して、それを見ながらACしよう。
・解説を見るべきはAC後。
・ARC出よう。
・1週間に1個のコンテストと本気で向き合おう。

といった所です。(めっちゃ思想強いw)

ちなみに、これは緑に到達するまでの話なので、水色以降に関しては話が違うと考えています。

あとがき

半分備忘録の要素もあるので、そんなに読みやすい記事ではなかったかと思いますが、ここまで読んでくれて本当にありがとうございます。

私がこの記事を書こうと思った理由

A問やB問を大量精進するも、CやDが解けない駆け出し競プロerが多い気がしたのが一番大きな理由です。

もちろん、「解ける問題を楽しいから解いている」という状態ならそれはすごく良い状態だと思いますし、無理して難しいのやる必要もないでしょう。

しかし、「強くなりたい」がモチベーションなら、AやBの大量精進よりも、CやDを毎週1~2問で良いから、やる事の方が大切な気がするのです。

正直、検索とかせずに自力AC出来る問題って、やる必要ないと思うんですよ。解く速度を無視したらですが。

でもやってる人は多い。

だからそれをやってない人の例が、何かの参考になればなーと。

まぁ、実を言うと、自分が出来るアルゴリズムをまとめたかったのも大きいんですけどね。

スペシャルサンクス

・ICPCに誘ってくれたK先生
・ICPC監督、コーチしてくれた N先生
・アルゴリズムとかを教えてくれた S先生
・ICPCチームとして一緒に頑張ってくれた仲間 Uさん、Mさん
・競プロ布教活動等で助けて頂いている ユースケさん
・大学の、プログラミングWS(勉強会)で一緒に学んでくれる皆様
・私にけんちょん本と螺旋本を託してくれた テルさん
・X,解説記事,本,グレーディングとお世話になりまくってる けんちょんさん
・毎週コンテストを開催してくださる Atcoder様
・必須サービスと化してるProblemsを運営してくれている Kenkoooo様
・最後の晩餐で覚悟を決めさせてくれた Likaf_さん
・緑以下を開催したり、Xで面白い問題を流してくれる くしらっちょさん
・来年「一緒にICPCRegionalへの残る」と言ってくれた 真鍋愛さん
・私をポジティブ界のtouristと言ってくれた Akiaさん
・「水色パフォを出せる」と信じれた私自身 uruzunyaa(私)
・いつもXで絡んでくれる方々
・緑以下コンテストでお会いした時、声を掛けてくれた方々
・競プロが好きな、全ての方々

皆様本当に、スペシャルありがてぇ。

入水記事で会いましょう。
では!

この記事が気に入ったらサポートをしてみませんか?