AtCoderで緑色になるまでにやったこと
はじめに
ABC165でやっと緑色になりました。
競技プログラミングを割とちゃんと始めてから、これまでにやってみたことを書いておきます。
初心者が陥りがちなポイントをまとめておけば、これから始める人に役立てるかなと思いました。
目次
環境の話
いろいろ揃っていて、いい時代ですね。本当に。
[環境] けんちょんさんその他、先人のみなさまの記事を読む
競技プログラミング、けんちょん氏のいろいろな記事のおかげで進めやすい
— は た む (@gg_hatano) 2020年1月16日
4年前くらいに少しやったときは、すぐにやめちゃったなあ
情報が充実しています。大変助かりました。
10回くらい読みました。
この記事を読んで、とりあえず800問解こう!と思いました。あと350問(2020/05/02現在)です。
[環境] C++11の環境をつくる@macOS
仮想マシンで環境構築する用のスクリプトを置きました。 atcoder利用で戦う環境 · GitHub
便利に戦える様に、c++11以上を使って、bits/stdc++.hをインクルードしたくなります。
ローカルでやるには色々面倒でしたので、仮想マシンを使いました。
↑の内容を、vagrant 2.2.6 とvirtualbox6.0.4で動かしています。
VScodeでRemove Developしたりするといいと思います。
[環境] atcoder-toolsは便利なので使う
atcoder-tools、なぜ今まで使ってなかったのか 意味がわからない
— は た む (@gg_hatano) 2020年4月3日
使いましょう。便利です。
[環境] atcoder problemsは楽しいので使う
進捗が閲覧できて楽しいです。学校の勉強もこんな感じでやりたかった。 https://kenkoooo.com/atcoder/#/user/gghatano?userPageTab=Progress+Charts
[環境] atcoder problemsのバーチャルコンテストは楽しいので開催する
ns-競プロ-20200416 https://t.co/J0NmOCsKe3 #AtCoderProblems
— は た む (@gg_hatano) 2020年4月17日
社内バーチャルコンテスト、割と盛り上がった
たのしい!!!自分でコンテストを立てれば、自分がまだ解いていない問題を、指定した難易度の問題からランダムに選んでくれます。超絶便利です。
参加する時間が他の人とずれていても、パフォーマンスの数字で競えるのも良いですね。
社内では、バーチャルコンテスト実施->リモート会議で時間を合わせて感想戦、を繰り返しています。強い人たちと直接話して、何を考えながら解いているのかを聞けると学びが多いです。
C++の話
こういうことを書き出すとキリがありませんが、3つだけ書いておきます。
[C++] 大きな桁の数字の扱いに注意する
提出 #9947919 - AtCoder Beginner Contest 108 https://t.co/Jx6hkcuuZg
— は た む (@gg_hatano) 2020年2月8日
intはlongにしろって何回言えばわかるのか
普段の業務では、int, long, doubleくらいしか使っていなかったせいか、大きな桁に慣れていませんでした。積極的にlong longを使っています。
[C++] 出力する少数の桁に注意する
cout << setprecision(10); などとしておきましょう。 ちゃんと計算しても、欲しい精度で出力しないと正解できません。
[C++] powが遅いので自分で書く
TLEするので、↓を用意しました。標準で用意されたものが遅いってどういうことだ。
typedef long long ll; ll mypow(ll x, ll n){ if(n == 0) return 1; if(n % 2 == 0) return mpow(x * x, n / 2); else return x * mpow(x, n - 1); }
他にも、long long用のgcdとか、mod(109+7)上での組み合わせとか、いろいろ準備しておくと戦いやすいです。
競技プログラミング特有(?)の話
[競プロ] まずは全探索する
C - Candles https://t.co/jPD09x6VFE
— は た む (@gg_hatano) 2020年2月8日
解の候補である連続するK本はN-Kくらいしかないのだから、全探索する
そりゃそうか
最初はきれいな解法を探しがちでした。
最近は、まずは全探索前提で考える、ダメなら制約を見ながら工夫する、という手順で考えられるようになりました。
Atcoderの解説PDFもそういう流れで書いてあることが多いです。全探索最強です。
[競プロ] (a+b-1)/a する
B - Power Socket https://t.co/8A8ZjOgkc2
— は た む (@gg_hatano) 2020年1月8日
こういうのでif文書いている自分が嫌だったけど、@drken1215 の記事を思い出して解けた
>しかし実はこれをまとめて (a + b - 1) / b と簡潔に書くことができます。今後頻繁に使うことになるテクニックなので習得しておきたいところです。
こういう便利なものは知っておきましょう。
[競プロ] コーナーケースに気を付ける
あーーーーーーーー幅1のときは1かーーーーーーーー #atcoder
— は た む (@gg_hatano) 2020年3月14日
おそらく、↓の問題の話です。アホですね。 atcoder.jp
Atcoderはテストケースが親切で、色々気づかせてくれます。 とはいえ、際どいケースはケアしないと爆死します。↓とか。気をつけます。 atcoder.jp
[競プロ] 速く解く練習をする
gghatanoさんのAtCoder Beginner Contest 159での成績:2129位
— は た む (@gg_hatano) 2020年3月22日
パフォーマンス:1108相当
レーティング:369→502 (+133) :)
Highestを更新し、8 級になりました!#AtCoder https://t.co/xiElLvujbl
やっとこさ茶色になった
解ければいいやと思っていましたが、それだとレートが上がりません。
速く解くのは大事。
[競プロ] 過去の皆さんの実装を参考にする
これのことですね。めぐる式二分探索、いいね
— は た む (@gg_hatano) 2020年4月14日
この記事のことだと思います。提出 #11969706 - AtCoder Beginner Contest 098 https://t.co/DrpWMnwz5H
— は た む (@gg_hatano) 2020年4月16日
けんちょんフォーマットで尺取法を書いたら正解できた
アルゴリズムはわかっても、実装で詰まって進めないことがよくあります。今後もあります。 自分で考えるのと並行して、人の実装を参考にするようにしました。いろいろな工夫がつまっています。
さいごに
[競プロ] AtCoderはすごい
atcoder.jp ほぼ毎週、オンラインのコンテストを無料で開催して、教育的な問題と解説を準備してシステムを運用して...ってちょっと考えられません。
コロナ対応のStayHome生活は、Atcoderのおかげでかなり充実しています。
引き続きどうかよろしくお願いいたします。
メモ
企業コンで関われるといいな。社内に最適化マラソンマッチのネタがあるはず...