💎

【AtCoder】入青した!ので語らせて【うれしい!】

2024/08/20に公開1

入青しました!!!!!!!!!!!

やったああああああああああ!!!!!

Hello Worldです!競技プログラミングをやってる loop0919 と申します!
AtCoderにて入青しましたので、入青記事なるものを書いてみようかなぁなどと思います!

※初色変記事なのでなんか取っ散らかってる部分があるかもです、ご了承ください!

プロフィール

  • 仙台のIT系専門学生(4年生)
  • 使用言語:Python
  • 競プロはじめる前に応用情報技術者試験に合格した
  • 数学は数Ⅲまでを独学した程度

精進記録

精進記録です。ABCの A~E 問題をメインに埋めています。(安定感を高めるために、 ABC の F, G 問題や ARC の問題も埋めたい気持ちがありますね。)


略歴

灰色時代 (2022/06/04 - 2022/07/16)

  • 競技プログラミングの動画を見てた
  • AtCoder を Rated で参加した

競プロでやったこと

基本情報技術者試験や応用情報技術者試験を受けて、アルゴリズム分野が特に面白いと思っており、競プロをスタートしました。自分の考えた動きをコードに落とし込んで実際に動いたとき、超気持ちいいですよね!!

azmさんの動画から競プロを知り、そこからハマった感じです。
https://www.youtube.com/watch?v=kRPyJkTKq-Q

とりあえず、コードの書き方や簡単なアルゴリズム(ソート・二分探索・累積和)、数学的考察あたりは競プロ始める前に勉強していた分野なので、それらを組み合わせて頑張っていました。

そして初参加のARCで緑上位パフォを取り、ジャンプして入茶しました。

やったことは殆どなく、今までの貯金で上がってます。

レート遷移

茶色時代 (2022/07/16 - 2023/05/14)

  • 競技プログラミングの動画を見てた
  • AtCoder を Rated で参加した
  • データベーススペシャリスト試験
  • ネットワークスペシャリスト試験

競プロでやったこと

その後も競プロを続けてました。「参加すればするだけレートは伸びる」って言う感じで参加してたので、精進自体はガッツリやってなかった感じです(こんなこと言うと怒られちゃうかもしれん…)。

ただ、競技プログラミングの動画を当時は色々漁っていて、特にazmさんや佐野さんの動画でアルゴリズムを学んでいました。
https://youtu.be/Y0UEyW64CzM?si=_L9qvSz0qfw5-rqE
https://www.youtube.com/watch?v=WyJvs9hL9Yc&list=PLCRqod_UBhUZ5C_T03dUEKqCB8H8_xFYE&index=3

ただ、2022/09 あたりで Splatoon3 が発売されて浮気してしまい、長い間休止していました(カス)。

そんなこんなで、ARC でまた勝って入緑しました。

それ以外でやったこと

この間にデータベーススペシャリスト試験に受験し、合格しました。
また、ネットワークスペシャリスト試験の方も受けましたが、落ちました(悲しい)。

データベース分野ではデータの正規化やE-R図の話で、内部実装についての簡単な想像ができ、競プロでの実装経験が活かせたのかなと思います。

ネットワーク分野でも、ルーティングプロトコルの動作やサブネットの計算などで、競プロのダイクストラ法やビット演算の話が活きた感じがあります。

「競プロで活きた」ってよりも、「競プロが活かせた」ことがあった感じがあります。

レート遷移

緑色時代(2023/05/14 - 2023/09/17)

やったこと

  • YouTubeで動画投稿
  • 精進しないとBANされる Discord サーバー
  • CTF に参加

当時は緑色パフォが限界値で、水色パフォが全く取れていませんでした…。
流石にしっかり精進しないとマズいと感じたので、競技プログラミング界隈に入って精進をしていこう!って感じになりました。

というわけで、まず 市民権を得るために動画を作って認知してもらおう! ってことにしました。(?!)

これは 2 本目の ABC311 の動画です。執筆当時 6000 再生以上されていてビックリしています(ご視聴してくださった方々、ありがとうございます!)。
https://youtu.be/Mvg0A7uFnEQ?si=IMaaEwcaqdCmXBHl

そんなこんなで Twitter (新X) のフォロワー数が 3 桁人になり、ちょこっと市民権を得ることに成功しました。

また、そのタイミングで精進しないとBANされる Discord サーバーに参加し、そこで自分のレートより高い diff を毎日精進する生活を 2 週間 \times 2 行いました。

この段階で AtCoder Problems の問題を埋めるスタイルの精進が定着したなぁ、って感じです。

レート遷移から分かる通り、レート 1000 付近で伸びの鈍化がありましたが、青パフォでジャンプしてその勢いで入水を果たしました!

それ以外でやったこと

また、この時期に SEA/J CTF という専門学生対抗の CTF大会 に参加してました。
https://www.sea-j.net/p-ctf2023

その際、プログラミング分野と暗号分野を担当することになったので、暗号理論の勉強をしていました。

Crypto Hack というサイトを使って、暗号理論の基本(XOR暗号、共通鍵暗号、公開鍵暗号、数学)を勉強していました。
https://cryptohack.org/

CTF 精進の記録

これによって、競プロで使う整数論が良い感じに身に付きました。フェルマーの小定理は \mathrm{mod} の逆元を取る際に使うし、何かと暗号でも競プロでも整数論を使うことが多いんですよね。\mathrm{mod} 998244353 をする問題で、殆ど詰まることなく解き進められるようになったのは大き目なアドバンテージになりました。

あと、情報処理安全確保支援士試験も受験し、合格しました。

レート遷移

水色時代 (2023/09/17 - 2024/08/17)

  • 過去問埋め
  • PAST本や蟻本を買う
  • 有志コンテストの Writer

ここから青までがとんでもなく長かった…。

競プロでやったこと

ABCを中心に、AtCoder Problems を埋めてました。
知っているアルゴリズムでも考察が絡んだり、実装が重めだと苦しいのが課題だったので、次のことを意識しながら精進をしました。

  • 次回以降似た問題が出たとき、再現性高く素早く AC できるようにする。

例えば、「添え字が合わなかったから、添え字ガチャをした」場合、そこから深堀りして、「どういう風に書けば添え字ガチャをなくせるか?」と言うことまで考えて精進しました。

添え字ガチャでありがちな累積和については、「累積和は acc_A = [0] + list(accumulate(A)) にして、 [L, R] の総和を取るときは L, R1 減らした後に acc_A[R + 1] - acc_A[L]」と書くように統一しました。

二分探索 についても、 ok, ng を使うめぐる式二分探索を採用し、境界で悩む時間を減らすようにしました。(ただ、今でも bisect ライブラリを使うときは怖いなぁと思いながら書いてます。)

また、考察が思いつかず解説を見る場合でも、「何故この考察が正しいのか、その考察が思いつくにはどのピースが足りなかったのか」を理解するよう解説を読んでいました。

例えば、AGC067-A は考察と実験力の足りなさで本番中 AC を取れなかったのですが、「実験は愚直解のコードを書いて考察する」「二部グラフの性質の知識不足」が足りない部分だったと理解しながら解説 AC を取りました。

結局、自分の腑に落ちるまでやることが精進なんだなぁと改めて実感しています。

  • とにかく AtCoder Problems の問題を埋める

成長するため、というより自己満足のための要素も強めですが、AtCoder Problems の問題を縦一列 (特に ABC212 から最新 ABC まで) を埋めるように精進を進めていました。

とは言っても、F問題以降はまだ埋め切れていないので、ここからもっと精進するぞ~!

また、これを機に PAST 本や蟻本を買って、色々なアルゴリズムを修得することにしました。

特に根付き木の最小共通祖先をライブラリ化したり、セグメント木・遅延セグメント木をまあまあ使えるようになったのは、これらの本のおかげだと思います。

また、EDPC や典型90、PAST あたりの問題も気が向いたときに解いたり、CodeForces や CodeChef に参加してみたりして、解く問題の範囲を広げたりしてました。


CodeChef、絶望的な狭義単調減少をかましていて涙😿

あとは、ご縁があり第2回緑以下コンテストやNew Year's Collaboration Contest 2024、水以下コンテストの Writer をしていました。(ありがとうございます!)

次のステップに上がるために

入青して嬉しい気持ちでいっぱいではありますが、まだ青コーダーとして戦い抜けるかと言う不安があったりします。

とりあえず、今認知している課題を纏めていきます。

  • ABC-F, G 問題埋めが甘い

とりあえず大前提これがあると思います。E まで解けても F が解けるかどうかが運次第になっている部分があるため、F以降を埋めて安定感を高めたいなと考えています。

  • 添え字周りの実装でバグらせる

ここは水色時代の章で触れましたが、 bisect の添え字だったり、 配列を逆順に回した後の添え字だったりがバグることがしょっちゅうあって困っています。

一応、境界がどこかと言うイメージはあるのですが、それでも以上・以下か超過・未満かで微妙に境界が変わるので、そこで少し合わないといった事故を起こさないようにしたいです。

  • 考察や実験が安定しない

特に ARC で顕著なのですが、考察が噛み合えば爆発的に勝つことができるのですが、できなければ冷えるという博打をすることがあります…。

考察テクのために知識を広げる・深めるためにも、いろんな問題からエッセンスを抽出するのが成長への鍵なのかなと思います。

最後に

ここまでの閲覧、ありがとうございます!
実のところ約 1 年水色で慣れているので、「なんか色濃いなぁ~」って思いながら自分の名前の色を見ています。

とりあえず当分の目標は青色安全圏内まで逃げ切りたいですね、頑張ります!

最後に、(最近全然動画を投稿していなくて申し訳ないですが、)YouTube で競技プログラミングの実況動画を上げているので、そちらもご視聴いただけると嬉しいです。

https://www.youtube.com/@for_i_in_loop

Discussion

blueberryblueberry

改めておめでとうございます~!再現性を意識するとか何が足りなかったかを整理するのができているの、とても強いと思います。僕も見習いたいです!