Hello, world!
こんにちは。Un_titledです。
その辺のなんでもない高校生で、競技プログラミングを趣味と主張しています。
たまたま見つけて面白そう!と思ったというだけの軽すぎる動機で、完全の未経験から競プロを始めました。
ただ、プログラミング自体が初めましてだったため、茶色になるまでにかなり苦労しました。始めたばかりのときに「こんなアドバイスがあったら!」みたいに思ったので記事にまとめてみます。
完全に未経験から始める方々にとって、この記事がはじめの一歩を踏み出すお手伝いができたらいいなと思います。
自己紹介
中3の春で競プロに出会ったものの、そもそも時間がとれなかったり、プログラミングの学び方がわからず、1年間灰色で停滞しました。
高1でかなりレートが伸びて、1年間で水色までレートを上げました。
執筆時点ではこのような感じです。
競技プログラミングとは?
決められた条件のもとで与えられた問題、課題をプログラミングを用いて解決し、その過程や結果を競うものを競技プログラミングといいます。
引用元 : 競技プログラミングとは? - AtCoder Info
きっとこの記事を見ている皆様については、競プロの定義くらいは知っているでしょう。ということで詳しい説明は省きます。
簡単に言うと、数学みたいな問題が出て、それについてプログラムを書いて解きましょうねみたいなものです。
魅力
特筆すべき最大の魅力?楽しさです。もちろん。
プログラミングを書いてる!かっけぇ!!みたいな気分になれるだけでなく、自分のレート(レベルのようなもの)が上がるとドーパミンに溺れることができます。最高ですね。
身につく技能など
プログラミングと名前についてるだけあって、実装は得意になると思います。
実装にあたって、順序立てて物事を考えることも得意になると思います。
パズル要素が強いので、頭の回転が速くなるというのもありそうです。競プロをしてから勉強の吸収率が高くなったような気がしています。
もしかすると競プロがしたいという欲望に駆られて効率が上がっているという説もあります。
始める前に身につけておくべき技能
自分が最低限必要だと思っているものはこのあたりです。
以下のものに不安がある場合は、先に解消してきてから戻ってくることを推奨します。
- 最低限の数学知識
- 四則演算ができる
- 文字式に慣れる
- PCへの慣れ
- 電源を入れられる
- 右クリック、左クリックの意味などが分かる
- インターネットで検索ができる
- 気合い
本題にはいります
AtCoderでのやり方を紹介します
アカウント作成
AtCoder
これがAtCoderです。
ユーザー登録までは AtCoderの始め方 を見てやってください。
アカウントができたら戻ってきてください。
そのほか便利なサービスについては
- NoviSteps
- AtCoder Problems
などがあります。検索してみてください。
基礎知識をつけよう
言語を選ぼう
言語は主にC++とPythonの2種類がメインで使われている印象です。
そのほかにもRustやC#などを使うユーザーもいます。
特に今使いたい言語がないならC++をおすすめします。
理由としては
- 解説がC++で書かれていることが多い
- 処理速度が速い
- C++ユーザーが多い
ことです。
Pythonは最初の言語のハードルが低いと言われることが多いですが、C++に比べて処理が遅いことが多いです。(Codonなどを使えば別ですが)
ぶっちゃけ、強い人はどちらの言語でも強いので、できないことを言語のせいにしそうだというならC++にしましょう。
特に 高校生以下で情報オリンピックの出場を目指して始めようとしている人 は C++ を使うことを推奨します。
セミファイナル、ファイナルステージでは、Pythonで満点解法が出せることが保証されていないケースだけでなく、使用可能な言語がC++のみである場合が存在します。
言語学習にはAPG4bと呼ばれている教材を推奨します。
C++ : C++入門 AtCoder Programming Guide for beginners (APG4b)
Python : Python入門 AtCoder Programming Guide for beginners (APG4bPython)
数学
中学数学の知識と、ある程度の高校数学の知識があればなんとかなります。
苦手意識のある人はアルゴリズム×数学の本がおすすめです。
基礎編
特に構えなくていいです。面積の出し方とかがわかれば大丈夫です。四則演算と、文字式にある程度の馴染みがあるとよいと思います。
中学受験でよく出てくるつるかめ算などができると強いです。
二進数についてはしっかりやることをおすすめします。そう難しくないのでぜひ。
中級編
- 場合の数
- 整数(倍数、約数、余りなど)
この辺ができていると、言語学習が終わった後に少し楽です。
発展編
- 合同式
- ユークリッドの互除法
- 三角関数
- ベクトル
- 行列
この辺は茶色以降でしか使わない 1 気がします。覚悟はしておくと後からやる気が出るかもしれません。
環境構築
この動画の通りにやればうまくいきます。
間違いなく、ローカルの環境はあったほうがいいです。
くじけない心
周りから刺激をもらうことは素敵なことです。私も日々多くのFFさんからやる気をもらっています。
ただし、比べすぎることが正解ではないということは明らかです。
これは冷静になればわかることですが、インターネット上にはあまりにも強い人が目立つことも事実です。
もし今の段階で同じように競プロを始めた人がいたとします。しかし、まわりの環境によって成長のスピードは大きな差が出てきます。精進できる時間の問題、プログラミングの経験の有無、数学の知識の量の差…
枚挙にいとまがありません。もしくじけそうになったときも、ぜひ「自分のペース」を意識してみてほしいです。
私はかつて灰色に1年近く停滞しました。なんなら茶色になった後、落灰も経験しました。そのような人でもその1年後には水色になりました。
生存者バイアス?楽しんだ者勝ちです。生存者になってやりましょう。その心意気です。
やる気のある方へ : Twitterを始めよう
競プロerはTwitterに多く生息しています。親切な人が多いと思います。わからない〜たすけて〜と言っていると、誰かがアドバイスをくれます。
自分は周囲に競プロ経験者がいなかったので、Twitterの先輩方の存在がいなければきっと挫折していただろうなと思っています。
繰り返しにはなりますが、Twitterは強い人が目立ちます。ボリュームゾーンが寒色に感じることも少なくありません。
自分のペースを見失わないことを心に誓えば、Twitterにいる競プロerの存在はこの上ないガイドになってくれます。
先に知っておきたい言葉の定義
基本用語集です
競プロ典型90にある 用語集 を見ておくと、提出するときに困ることはないと思います。
載っていないが知っていた方がよさそうなもの
- レート
偏差値みたいなやつです。数が上がると強くなります。 - 色
レートが色分けされています。レベルのようなものです。灰〜緑を「自然色」、水と青を「寒色」、黄〜赤(自由色)を「暖色」と表現したりもします。 - パフォ
パフォーマンス(成績)です。ABCなどに出たらわかります。 - rated / unrated
レートにコンテスト成績を反映させるのがrated、反映させないのがunratedです。rated範囲外のコンテストにはunratedでしか参加できません。unratedのことを「あんれ」と呼んだりもします。 - Difficulty
「現在の内部レーティングがこの値の人がコンテストでその問題を見たら50%の確率で解けると考えられる値」のことです。diffと略されることが多い気がします。注意したいのは50%のラインであって、「解けて当然」という意味ではないということです。 - A / H
アルゴリズム、ヒューリスティックの頭文字です。 - ABC
AtCoder Beginners Contestの略称です。初心者向けと言っていますが、初心者が初めましてで全部解けるものではないので、始めの方は1完をすることを目安にするとよいと思います。
茶色になるには?
C++のAPG4bを利用する人向けに書きます。
1章は完璧にしましょう。まずはここからです。
2章は少し難易度が上がりますが、一通り目を通すことを強く推奨します。
3章、4章は気になったときに見るくらいでも大丈夫です。
2章まで終わったら、最近開催されたABCのA問題、B問題を解いてみましょう。これが難なく解けたらいよいよアルゴリズムの学習を始めてよい頃だと思います。
鉄則本 と呼ばれる本を購入するのが最も良いと思います。
入茶は自分がかなり苦しんだ部分でもあり、記事になっているのでよかったら参考にしてみてください。
最後に
文章を長々と書いていたら、言うことがなくなりました。
最後までありがとうございました。
いつか暖色になりたいです。以上水色下位の戯言でした。ご清聴ありがとうございました。
-
素直に言われたことが実装できるようになったうえで、基本的な計算量に関する意識が持てると茶色になれると感じています。緑以降は必要です。 ↩
