はじめに
おはこんハロチャオ!
正月実家でやることがなく暇すぎるので昨年半年の振り返りと言う意味も込めて Go で AtCoder をやった感想をまとめようと思います。正月らしく(?)アニメを観ながらだらだら書きます。
Go で始めた理由
2022年の4月からコードを書くバイトを始めました。そこで Go を使うかもと言われていたので勉強しようと思っていたところ、それと同時期に複数の知人から AtCoder を勧められました。それ以前には Python しか書いたことがなかったのですが、実行速度が気にかかったのと、どうせなら新しい言語を勉強しようということで Go で始めてみることにしました。
アカウント作成時
レートの画像を見てわかるとおり実はアカウントを作成したのは2020年の10月です。友人に ARC に出場させられて a 問題だけ解いて終わりました。確か Python で出たと思います。結局当時は全然興味なくて (スマブラばっかやってて) 筆者の AtCoder 人生は一度終わりました。始まってもないですね。それから2年ほど AtCoder とはお別れすることになります。
2022年6月 ~AtCoder との再会~
6月の中旬、上述の経緯で AtCoder を始ようとアカウントを引っ張り出してきて初めにやったことは AtCoder Beginners Selection でした。とはいっても Go の記法も慣習も何も知らなかったのでまず人の提出を眺めていました。それで Go の書き方を学びつつ、AtCoder の雰囲気を感じつつ進めて、提出方法や入出力などの方法は掴めたと思います。そして Beginners Selection を全て終えたその日に ABC があったので出よう!ということにはならずチキって出ませんでした。
その後数回分の ABC の過去問を眺め、次に取り組んだのは競プロ典型90問でした。この辺りは知り合いの競プロerの指示に忠実に従ってましたね。典型90は難易度の低い順に進めました。6月は☆3の問題を終わらせて☆4の問題にさしかかったところで終わりましたが、この辺りの問題は考えれば 通すことが出来たのでめちゃくちゃ楽しかったです。
そして6月最終週には ABC に初めて出場しました。結果は C 問題を Go のソートのパッケージを調べるところから始めるも実装がうまくいかず2完に終わりました。そもそも C レベルの問題に触れたのが初めてだったので順当な結果ですね。
2022年7月 ~D問題と格闘、入茶する~
7月は続けて典型90を進めました。と言っても、アルゴリズムは全く勉強したことがない (二分探索の名前しか知らなかった) ので大体答え見てましたね。計算量の見積もりの練習と思って全探索みたいなアルゴリズムでTLEすることだけ確認してすぐ解説を見ていましたがどれほど意味があっただろうか...。また、登場したアルゴリズムで二分探索やダイクストラ、union-find などの重要なものを実装しながらだったのでだいぶのんびり進めていました。この辺りは標準のパッケージが少なく、AtCoder Library も使えない Go の弊害がでてますね。
また、7月中旬から時間に余裕が出てきたので ABC の過去問を新しいものから解き始めました。この頃は、1日1つの ABC を D 問題まで取り組んでいたと思います。
さて、肝心のコンテストですが、6月の終わりから7月にかけての典型90の取り組みで C 問題は安定して解けるようになりました。そして D 問題にも手が出るようになり、7月初め、2回めに出場した ABC258 では4完することができました。しかし7月のこれ以降の ABC では緑diff以上の D 問題が続き3完に留まっていました。ただこの間にも茶パフォ、緑パフォが出ていたこともあり入茶できました。そうして、次なる目標は D 問題を安定して解くこととなります。
8月、9月 ~過去問マシーンと化す~
正直夏休みの記憶がバイトと ABC の過去問を解いていたことしかないです。この頃がここ半年で一番 AtCoder に時間をかけていたと思います。典型90は8月までぼちぼち進めており最高難度の☆7の問題をいくつか残して面倒くさくなり辞めてしまいました。7月に解けなかった D 問題を解けるようになるために、難しい問題よりも緑〜水diff の問題の練習に注力したかったからですね。そして ABC の過去問を進めるペースが上がり1週間に10回分ほどのペースになっていたと思います。暇人ですね。そういえば夏休みは DQ8 もやってました。
話が飛んでいきそうなのはアルコールのせいにして話を戻します。コンテストでは8月の最初の ABC263 は出場出来ませんでしたが、お盆にあった2回目の ABC264 ではスムーズに E 問題まで解くことができ、初の水パフォを出せました。めちゃめちゃ驚きましたし、嬉しかったです。直前にビールを1本飲んでいたのが良かったのかもしれません。ここでレートが一気に伸びたことで8月最後の ABC266 で入緑できました。9月になると少し過去問を解くペースは落ちていたのですが D 問題は高い確率で解けるようになっており、8,9月に出場した7回のコンテスト内4回は水パフォが出てコンスタントにレートが上昇、2ヶ月で 486→1011 という結果でした。思ったよりも早く入緑できたのでこの辺でなんとなく年内入水を意識し始めました。
あと、この頃は DP を親の仇のように憎んでおり毎回 DP 絶対倒す!!と意気込んで出場してました。意味不明ですね。結果 DP は結構得意になったので毎回 DP 出してください。よろしくおねがいします。
10月 ~アルコールの弊害と失速の兆し~
後期が始まりそうでなくとも9月の後半から AtCoder に充てる時間が減っていったことで控えめな成長となりました。ABC の過去問の解くペースは週に4回分程度だったと記憶しています。とはいっても8,9月のお釣りでレートは上昇し 1011→1125 という結果でした。
一度の飲み会の後に参加した ABC274 では D 問題が解けずの3完でレートを下げる結果となりました。がっつりアルコールが入った状態でコンテストに出場するとパフォーマンスが落ちるということがわかりました!!!皆さんも飲酒して際は出場しないか unrated で参加しましょう!!!
11月、12月 ~スプラにはまる、そして入水~
11月にポケモンSVが発売されました。そして筆者は何故か10月に発売されたスプラトゥーンを始めます。意味不明です。この時からはほとんど過去問を解いておらず、コンテストに出るだけでした。当然レートの伸びが小さくなっていきます。その上、酒を飲んでコンテストに出場しレートを下げます。それも2回。この方は学習能力が皆無なのでしょうか? (その間シラフでも一度レート下げました。) その結果、12月の中頃にレート1163で年内の ABC が残すところ2回となりました。筆者はこの期に及んで年内水色の夢を捨てていなかったのでこの2回で水パフォを出さなければという強い気持ちで飲酒を控えて出場します。
そして迎えた ABC282 。レートを下げます。えーと終了ですね。年内水色は無理です。D 問題で1時間勘違いしたまま3完で終わりレートは 1146。悲しみながら1週間スプラをします。
年内最後の ABC283 。前回のレート減少で年内水色の夢はついえておりモチベも下がりきっていましたが、でも水色にはなりたいと思い参加します。ここで奇跡が起こりました。D 問題までは難易度も低くサクサク進み E 問題。DP でした。ここで夏休みに特に意識した DP に救われました。初めてコンテスト中に青diff の問題を通し結果は5完。パフォーマンスは 1600 のぴったり青。そしてレートは 1202 となり晴れて水色に、消えたと思っていた年内入水が実現したのでした。
Go でやってみた感想
Go で AtCoder をしたというタイトルなのにあまり Go について触れられませんでしたが、Go でやる AtCoder は楽しかったです。実行速度が速い点、書きやすい点、人のコードが読みやすい点はよかったかなと思います。その代わり多言語にある関数などがなく自分で実装する必要があるものが多い点は大変でした。筆者はアルゴリズムの勉強も兼ねていたので実装がかなり力になったと感じましたが、そのような目的が無い限り競プロをやる上でお勧めできる言語ではないかなと思います。
加えて、これは Go 以外の言語にも言えることですが、multiset が想定解法の場合はなんらかの代替案を用意しておく必要がありそうです。特に Go の map (連想配列) は貧弱なのでデータ構造を自前で用意しておいたり座標圧縮を用いるなどの工夫が必須です。フルスクラッチでやりたいみたいな方にはいいかもしれないですね。
これから
スプラやります。気が向いたら入青目指してやるかも。