見出し画像

AtCoder黄色になりました

自己紹介(宣伝)

株式会社AppBrewという自ら創業したスタートアップの代表取締役をしています。28歳で、競プロ的にはそこそこ年長です。
LIPSというコスメの口コミSNS(https://lipscosme.com/)を運営しており、今フルタイムのメンバーが60人くらいです。
21歳の時(7年前)に起業した会社で、大学(東京大学工学部)を学部3年の始めで中退済みです。美容は興味のあるエンジニアの方が少ないのですが、業界的には実はテクノロジーが入る余地が意外とあって面白いので、中途学生問わず興味のある方は是非話しましょう。あと競プロerの方なら会社関係なく是非ご飯行きましょう〜。質問などもあったら是非。

基礎能力面でいうと、理系であり数学は好きですが大学入試の時からそれほど得意ではなかった(サボり魔だったのもある)です。競プロでも数学的考察やひらめき系の問題に得意意識はなく、精進量あたりの実力も高い方ではないと思います。
蛇足ですが音ゲーが好きで長らくやっており、IIDX両皆伝です。

やったこと(データ)

始めたのは2021年の12月で、ほとんどノンストップで1年2ヶ月強続けてきました。言語はC++オンリーです。

割と満遍なくやっています
橙くらいまでは恐れずやる、始めたら通すところまでは頑張るという感じで埋めてました。
(橙は解説ACも半分くらいあります)

既知のリンクなど

割と初期(茶〜水くらいのころ)この記事の150問・典型90問(最後の1問のFPSパート以外)を埋めました。特に典型は2周しました。
その後鉄則も復習的な感じで全部、EducationalDPも全部、PASTを8回分くらい埋めました。
https://atcoder.jp/contests/typical90
https://atcoder.jp/contests/tessoku-book
https://atcoder.jp/contests/dp

hamamuさん、社会人になってから始めた勢の先輩でもありますし、ライブラリや問題を解く部分以外での向き合い方など色変記事の中でもとりわけ参考にさせていただきました。

意識していることなど

コンテストに出られるだけ出る

発熱や遅刻以外のタイミングでは基本ratedで、参加できるコンテストは全部出ていました。解けなかった問題+1問くらいも(難易度によりますが)必ず解いていました。

本番を意識した練習をする

単に問題を解くだけではなく、パフォーマンスを出すためには考察・実装・デバッグを全て高速にできる必要があるので、基本的にはほとんどバチャ形式で練習していました。

新規学習をする(知識精進)

新規知識・テクを必要とする問題(基本適正以上のdiffで2色上くらいまで)を最優先で埋めました。ABCの橙埋め(最近のは埋まってないものもありますが)もやりました。とにかく「これは聞いたこともなかった」が理由で解けなかったものをいち早く減らすことを意識しました。
これに関しては一度とりかかったものは必ず解説を開いて自分のコードでACしていました。
一度では理解しきれなかったもの(https://atcoder.jp/contests/abc231/tasks/abc231_gなど)は何度かやり直したりもしました。

早解きをする/ライブラリの抽象化をすすめる(実装精進)

バチャで早解きをしました。cfのdiv3やABCをメインでやって、どこで詰まったかに応じて見直しをしました。
・考察で時間かかるパターン
問題に応じてパターン化する(メモする、頭の中の考察木を見直す)
制約や問題をよく読んで愚直や実験を書く。
いろいろ無視してデータ構造パンチ(できる場合のみ)
ググる(OEISやwolfram含む)
・実装で時間かかるパターン
中途半端な考察で実装に入らない(ガチャガチャになる)
楽な実装方針がないか始める前にチェックする。
ライブラリを増やす(後述)
・デバッグで時間かかるパターン
初期化・境界値・添字、よくあるパターンを経験して慣れる。
デバッガ(macでやっているのでlldbを使っています)を整備する。
デバッグ出力を整備して全部出力してみる。
面倒がらずに愚直とランダムテストを書く。

ABCの〜Fやdiv3/div4やPASTを詰まらずに通過できるように意識していました。また使った時間の上位者との比較、コードの差分やそこから読み取れるライブラリ・典型力・考察力の差なども確認するようにしていました。

ライブラリを増やす(実装精進)

ライブラリは特に複数人の強い人のコードを読んで(問題によっては5分で解けても1時間他人のコードを読むなど)参考にして実装したり、拝借したりなんでもやっていました。ただ出来るだけ一度は自分で書いて、その後既存のもの(か参考にした実装)を使うようにしていました。
テンプレも、
・型定義とマクロを充実させる(可変長引数マクロとか)
・よくある入出力やデバッグもマクロにする(型問わず3秒で出力できるようにする)
・よくある乱数生成を書き溜める
・よくある数値処理を入れる(約数mex桁ごとに分解など)
・よくある操作を入れる(座圧のマッピングとか)
・愚直+ランダムテストにすぐ移行できるように関数を作っておく
などをしました。

いわゆるライブラリも通り一遍のものは用意したと思いますが、加えて時間がかかるorバグらせやすい処理は自分でライブラリ化していました。
・勝手に差分更新してくれるDP用の累積和
・回転や反転をO(1)でできる1,2次元のベクタ
・区間集合の和や積をsetで管理するもの
・列の平方分割
・長さn、0~mの非負整数列の全列挙(実験用が多い)
・順列の置換、置換を出力するソート
などなど。
メモ:やってないがやりたいもの
・セットのマージテクや一括操作
・両側からの累積和を使う処理
・全方位木DPの抽象化

あとは、atcoder-cliやvisual_codeのcoderunnerの整備など、環境構築も一通りやりました。コンテストURLをもとにフォルダを一括生成するスクリプトを書いて、書いたコードは全てフォルダ分けしてgitで管理しています。
https://github.com/yfuka86/pc

最近のsubを貼っておきます。手動でワンライナーに圧縮する趣味があり、読みにくい上、テンプレパートはかなり他人の実装を真似ている気がします。バグやクソ実装などはマサカリをください。

考察精進

ここが一番一般に競プロのつらみと言われるパートで、もともと持っているものによって差がつきやすく、かつ向上する方法が最も非自明なパートと思います。
まず、とにかく上記の中でできることをやりました。知識、定式化、ライブラリ化と抽象化、わかる範囲の数式や公式を覚えるなど、考える上でノイズになりそうなことをどんどん自明にしていって、シンプルに本質的な考察に集中できるようにしてきました。(ceilとか二分探索とかランレングス圧縮とか任意の頻出実装を使うべき問題で、細かい実装に脳のリソースを割かないように、など)

その上で少し上のdiffくらいのARC/div2などの問題を自力で解く練習をしていました。バチャの後半でやる場合も、ピックアップしてやる場合も両方あります。
考察も数式やグラフ、簡単なケースを書き出したり(僕の場合はペンと紙とバインダーを必ず右側に用意してあります)しながら、
自明な性質、あったら嬉しい性質、同値な言い換え、一般には解けない(NP)、不変量、単調性、順序関係、自明な上界、必要性十分性などなど、気づいたことをメモしたりコードにコメントしたりしていきます。わからなかったら解説を見ることもあれば、寝かすこともあります。また、いわゆる典型的アルゴリズム以外にも、よくある操作や構造という「考察典型」的なものや、ゲーム構築数え上げを中心とした「実験典型」的なものも網羅できるように場数を踏んでいきます。

解けても、時間がかかったり不確定要素があった場合は解説を読んで書き直したり、複数解法があったら3,4種類全部書いたり、振り返りをしました。
わからなかった場合はupsolveするだけじゃなく、どうしたら辿り着けたか、上位者はこう考えた(コード読みながら)のではないか、という道筋をイメージしたり書き出したりということをやっていました。似た問題に覚えがあれば探しだしてそれも復習していました。

こうして量を重ねると最近は次第に思いつくことが増えてきたり、勘所がわかったり、スムーズに数式に落として考えたりということができるようになってきました。ただこれに関しては黄色になるくらいでは客観的にもまだまだな部分だと思うので、ここまでにします。今度作問とかもやってみたい。

コンディションを整える

世の中ではほとんどの場合期待したような成果は出ません。好きと能力、遺伝子と環境が噛み合わないと突き抜けられはしません。ただ、勉強や運動など一人でできる・コントロールできることは時間をかけて頭を使って積み重ねればある程度までの結果にはつながりやすいと思います。一方で時間は有限なので、やりたくないことはやらず、それでもやりたい、やるべきと思えることはエネルギーを割いて粘り強く続けるというのを意識しています。

結果が出ない時=特定の問題やコンテストで破滅した時、初期はとても辛い気持ちになっていましたが、徐々に慣れて破滅の仕方もパターン化してきて、冷静になれるようになってきました。運もあれば、仕方ない実力負けもあります。どうしようもないので、同じ負け方をしないように反省して、次頑張ろうと意識的に思い直すとよいです。

また競プロに限らず、苦手なこと・ストレスを避けたり、自分が得意・やりやすいやり方でやるというのも意識しています。しんどい時は早めに休むが、長期的に出来るだけ休みを減らせるようにするというのも大事です。
あと、運動です。血流(デスクワーク勢にはストレッチやヨガがおすすめ)や代謝めちゃくちゃ大きいです。適度な運動が脳のパフォーマンスやメンタルに+に影響することは科学的にかなり確度の高い論拠が多数あります。
まだ28ながら、10代の時と比べると意識的にコンディション(健康)や時間、メンタリティを調整しないと、社会人から始めた人間が一人でパフォーマンスを安定させつつ実力を伸ばしていくのは難しいなと感じています。

まとめ?

人生いろいろあるのでどれくらい労力を競プロに割いていけるかはわかりませんが、できるだけ続けたいし、続ける限りは実力向上にコミットしようと思っています。
何においても上を見るとキリがないですが、複数分野で弛まず精進すると組み合わさった時ユニーク性が生まれたり、すごく差がついたりするというのがモットーです。競プロも客観的にトッププレイヤーになるのは難しいと思いますし、本業は経営なのでそっちに集中しろという感じもありつつ、ここまでやってきたことは財産にもアピールポイントにもなったと思います。

橙になるのは難しいかもしれませんが、アトコに限らず色の安定やhighestの更新はモチベになります。また色変記事かけるといいな。
いつもtwitterで絡んでくださる方、一緒に精進してくださる方にはとても感謝しております。引き続き一緒に頑張りましょう。
ABC288の決勝のイベント?側には参加できそうな気がするので、よかったら是非直接話しましょう〜。

P.S. 最近は英語の勉強をしています。会社で英語のサービスを作っていたり、会社の設立記念日(2/26)にTOEFLを受けにいく予定です。こっちも結果出したい。


この記事が気に入ったらサポートをしてみませんか?