赤い星と強い星

ディズニーとかその他の趣味とか

AtCoderで緑になってもうすぐ1年になります

A: こんにちは

 (解説: RedSpica)

  プログラミングの学習を始めたばかりで何から手をつけるべきかわからない方は,まずは「practice contest」の問題A「はじめてのあっとこーだー」をお試しください.言語ごとに解答例が掲載されています.

atcoder.jp

 

 最近は天気が悪い日が続いていて,なんだか嫌な気持ちになりますね.いろいろなことがあり積極的に外出しようとは思えない今皆さんはなにをして時間を過ごしているのでしょうか.

 

 僕は競技プログラミングを始めて1年とちょっとが過ぎ,AtCoderのレート帯が緑になってからもうすぐ1年になろうとしています.「ほぼ1年このレート帯にいるんだし,それくらいの適正はさすがにあるでしょう」ということで,偉そうに競プロのことを語る記事を書いていこうと思います.色変記事みたいなものだと思って読んでください.

 

 

スペック

 国立大学の数学科に所属して3年目になります.AtCoderのレートは1185(7/11時点),第3回アルゴリズム実技検定中級(64点)です.

f:id:RedSpica:20200716034244j:plain

 競プロをするための基本的な文法は1年の時の春休みにAtCoder Programing Guide for beginnersで学びました.

atcoder.jp

 こういった「問題を解いて人と競う」というタイプのものは(受験を除けば)実は競プロが初めてではなくて,数学オリンピックの予選を2回(Cランク1回,Bランク1回)受けたことがあります.このことは次のところで書きます.

 

 競プロで使える言語はC++(メイン),Python(ときどき),C(一応書けるレベル),Brainfuck(ACランキング7th)です.言語の仕様とか未定義動作とかは全く知りません.あくまで筆記用具と解答用紙がプログラミング言語になったくらいの気持ちでこれらの言語を使って競プロをしています.

 

したこと

 競プロを始める前に数学オリンピックの予選の勉強を少しだけしました.自慢できるほどの勉強量と点数ではありませんが,それなりに役に立っていると思います.やったことは予選の問題を数年分解く,数学オリンピックへの道(組合せ論と数論はそれなりに熱心に,三角法はほとんどやってない)を基本問題だけ解くという感じでやりました.組合せ論と数論の証明問題は競プロに活きているなーといった感じです.ちなみにマスターオブ整数/場合の数はやりませんでした.存在を知らなかったのもあります(これは嘘で,Amazonのほしいものリストに高1の頃マスターオブ整数を入れた覚えがあって最近消した).

 競プロユーザーがマスターオブシリーズをやるかどうかみたいなのは賛否両論あると思うんですが,個人的には「組み合わせは過去問埋めのほうが効く,整数は受験で使わなかったならやる価値がある」んじゃないかなあと思っています.まあやるに越したことはなくて,やってない人間の意見なのであまり参考にしないほうがいいです.

 

 そろそろ競プロのしたことを書きます.APG4bはテキストとしては1章だけやりました.1章だけやってしまえばABCの過去問はBとかCくらいまでなら戦えるのでとりあえず1章やったら過去問埋めに移ってもいいと思っています.2章の内容をやってから過去問をやったほうがいいのはそれはそうなんですが,僕は待てませんでした.実際,2章でやるべき内容は各項目の題名を見る感じ過去問を埋めて習得できている気がします.

 

 一般に精進と言われることですが,緑になるまでは緑になるための精進を,緑になってからは一切の精進をやめました.

 緑になるための精進は「これをコンテスト中に解けたら大幅にレートが上がるであろう問題を時間をかけて解く」といった感じです.体感,APG4bの1章をこなせば平成ABC(ABC125以前)ならB問題まで,令和ABC(ABC126以降)ならC問題までならほとんどの問題が難しいアルゴリズムやデータ構造を知らなくても解けるので,それくらいのレベルの問題を1時間くらい考察して,それでもダメなら自分が知らない知識を使う可能性が高いのですぐに答えを見ました.それくらいのレベルの問題がすらすら解けるようになると,現行のABCのDくらいなら戦える力がついてくるのではないでしょうか.緑になってからは毎週開催されるコンテストの問題を解くくらいのことしかしていません.強いて言えばBrainfuckのAC数が100くらい増えました.

 

問題を解くときに考えること

 コンテスト中ではない時と考えてください.

 まずABCのAやBを解くときです.問題を完全に理解しなくてもいいので,とりあえずさーっと問題を見ます.よく見るべきなのはサンプルです.1つめの入出力例と「なぜそれが出力されるのか」といった感じのコメントをよく見ると解法が浮かび上がってきます.そこまできたらもうやるだけです.あとは,だいたいの問題が制約に十分余裕があるので何も考えずにループ構文を書いて全探索するというのも1つの手です.

 次にCやDを解くときです.こっちは逆に問題文を完全に理解するまで何度も読みます.問題文を読んだらサンプルを見てまずは「自分が本当に問題文を理解したのか」を確認します.この時点で解法が浮かんでいるならすぐにコーディングに移るべきですがそうではないときはまず紙に書いて考察をします.

 愚直では通らないので計算量を削減するというタイプの問題は,いきなり減らそうとするのではなくとりあえず愚直で考えてみて,計算量が減らせそうなところを減らしていくという感じです.

 構成とかYesかNoの判定みたいなやつはまずケースが小さい例で書いて試します.なんとなくいけそうな気がしてきたらあとは与えられた条件式とにらめっこをします.また,条件を満たさない構成/Noになる場合を自分で考えることもとても大事です.「これを満たしてたらYes,そうじゃなければNo」という考えも大事ですが「これを満たしてたらNo,そうじゃなければYes」という視点をもつといいと思います.

 考えても解けそうにない問題や,初手がわからない問題はすぐに解答を見るかブラウザバックします.

 解けたと思ったらとりあえずコーディングをして,とりあえず提出をします.ACでもWAでもすぐに解答を見ます.

 

 このすぐ解答を見るのは数学オリンピックの勉強をしているときからのくせなのであまりいいことではないかもしれませんが,自分にとってはこれが最善だと思って続けています.というのも,「自分が知らない公式,データ構造,アルゴリズムを使う問題だったら無駄に時間を消費したくない」という気持ちが強いからです.

 

コンテスト中に考えること

 ほとんどの人がレートを下げたくないと思っているはずです.僕は一切精進していないくせしてそういった思いは人一倍強いので常に逃げることを考えています.といってもABCでNoSub撤退をしたことは3回くらいで,だいたい何かしらの提出をして,なにかしらのレート変動をしています.

 問題を解くときは丁寧丁寧丁寧にやります.具体的には

  • 簡単な問題だったとしてもコードが正しい答えを返すかを確かめる
  • しっかり問題を読む

 といった感じです.だいたいは問題を解くときに考えることで書いたことと同じですが,ペナルティには細心の注意を払います.何も確認せず提出して1ペナをもらうよりも,しっかり確認してノーペナでACをしたほうが確実に結果はいいはずです(簡単な問題のコードチェックは5分もかからないはずなので).

 

競プロをする環境

 エディタはVisual Studio Codeを使っています.特にこだわりはなく,設定もほぼすべて親友にしてもらったので便利な機能とかはほぼ無視している気がします.ただ,かっこを自動で補完してくれたりネストがどこまで続いているのかを線で教えてくれたり,あとは変数名とか型名に色がつくのは全部同じ色よりは便利だなとは思います.

 

 キーボードはFILCO Majestouch茶軸というものを使っています.日本語配列です.側面印字のキーキャップと追加で買った無刻印のキーキャップを混ぜて使っているのですが,かっこいいし使いやすいのでとても良いです.

 マウスは最近Logicool G Pro Wirelessというものを使い始めました.ゲーミングマウスなので遅延も全くなく,ワイヤレスなのでコードを気にせず使えて僕の狭い机ではとても助かっています.ただ,ゲーミングマウスのなかでも群を抜いて値段が高いです.余談ですが,左右クリック以外のボタンがついているマウスを使っている方はそのボタンにEnterキーを振り当てると人生が数倍豊かに暮らせると思います.

 モニタは20よりちょい大きいくらいのインチのやつを使っています.左側に問題,右側にエディタといった感じでコーディングをしています.

  考察ノートはすべてiPadとApplepencilとGoodnotesというアプリを使っています.方眼用紙にするととても便利です.

 競プロをしているとき(というより作業をしているとき)はいつもすきな音楽をかけています.歌いながら考察をするとなんかはかどるきがしています.勉強をするときはoff vocalの曲を流すのが1番いいらしいということを高校の時に聞いたことがありますが,真偽はよくわかりません.

 

 さいごに

 ここまで読んでいただきありがとうございました.少しでも参考になった部分があれば幸いです.なんでこんなまじめな文章書いているんでしょうか.おしえてウッウ笑ちゃん笑