はじめに
ダラダラ続けていたらABC382で入水したので慣例に従い色変記事を書きます。
(ABC382の前日くらいから体調が悪く、2024/12/2 0:30くらいからノリと勢いで書き始めたため後で変な部分を見つけたら直します)
https://x.com/Clever_Elsie_/status/1862865691256463451
初めましてなので自己紹介
- プロフィール
- 2024年12月2日現在、広島大学情報科学部2年生
- 使用言語は主にC++。一応Python, Java, Rustも基本文法はわかるので書けなくもないこともないこともない
- 競プロを始める前から出来たこと
- C言語プログラム(学部の授業では全く困らない程度)
- C++の(非テンプレートの)クラスを使ったオブジェクト指向プログラミング
- デスクトップPCを自作してたりで計算機についてはある程度の知識があった
- 競プロを始めたきっかけ
- AtCoderは大学入ってから友達に教えてもらい始める
- ツンデレなので教えてもらってからしばらくは手を付けず
- 1年生の後期くらいから暇潰しにABCのA問題やB問題を解いてたら結構な量になってたので2年生になってから本格的に始める
- 入水時のスペック
- C++のSTLをある程度使いこなせる
- 大学で数学の単位をギリギリかすめ取ることで落単を防ぐことができる
- 鉄則本を8割方理解している
- 蟻本をつまみ食いしている
- DPなんもわからん
- 仕様環境
- Windows 11 WSL2 Ubuntu 24.04
- GCC14 C++23 + ACL
- VSCode(Vim拡張)
- サンプルを登録して一括テストしたり、色々自動化する便利なmake黒魔術環境を用意している
- よく使うけど毎回書くのがめんどくさいデータ構造やアルゴリズムはまとめて保存している
AtCoder Problemsで確認できるデータは以下のようになってます。
AC数の割にレートがかなり低めなのは暇潰しにA問題やB問題を潰しまくることが多々あったためなので、レート相応のdiffの問題への対応能力は低めです。
やったこと
cpprefjpを読む
vector, list, set, map, deque, priority_queueなどのデータ構造や、sort, uniqueなどの便利関数、C++11以降で追加された新しい便利機能など、C++についてわかりやすく、見やすくまとめられた良いサイトです。
C++の入門書は内容が古く、新しく追加された便利機能についてほとんど言及されていないので、cpprefjpのデータ構造や新機能のところを読むというのはかなり実装の助けになりました。
初心者のためになりそうな話をちょっとしておくと、あるデータ構造のクラスのオブジェクトをa
としたときにa.begin()
とa.end()
があるときにfor(auto&x:a)
と書くと中身を前から順番にx
として扱うことができる範囲forという構文があります。私はC言語を始めに学んだタイプの人間なので、これを初めて見たときはすごく便利だなと思いました。
これの拡張に構造化束縛によるfor(auto&[x,y]:a)
と書くことで構造体に宣言されている1番目の変数と2番目の変数を分解して取り出せるようにした記法もあり、vector<pair<int,int>>
やmap<int,int>
などをイテレートして処理を行うときに便利なので是非調べてみてください。
他にもライブラリを整備するときは右辺値参照やテンプレート機能、concept、可変長の諸々などについても調べると面白いです。
鉄則本を読む
灰から茶、緑まですぐに上がれたのはひとえにこれに尽きると思います。
読んでやるだけでいい感じに問題が解けるようになります。
私は鉄則本のおかげで累積和や二分探索、簡単なグラフ問題などが得意になってかなり助けられました。
入緑したときはABC359でE問題のスタックに積んでいく解法は鉄則本で見たところから発想を得てACしました。
Nimやヒューリスティックはまだ理解してないです。
典型90問の星4(緑)以下全埋め
嘘です。012-Red Painting解けてないです。
とりあえず色を見て解ける問題だけ解きました。
入水したABC382のF問題と同じだと言われていた029-Long Bricksだけは、本当に同じじゃないかってひとりごと言いながら昨日解きました。
遅延セグ木は中身を理解していないけど、使えるのでまあいいかなって感じで。
AtCoder Probremsで目についたいい感じのdiffの問題を解く
私が暇なときに解く問題を選ぶ基準は色ですが、色の割に解けない問題も結構あるので遭えなく撤退することもしばしばあります。
私はあまり解説ACをせず、解ける問題を気持ちよく解くことの方を大事にしています。
解けなくても未来の自分が何とかしてくれると信じましょう(?)
競プロ環境を整備する
見せるのも恥ずかしいような環境を使っています。
競プロ環境
スニペットライブラリ
#define int long long
していたり、よく使う(メンバ)関数の省略を大量に#define
していたり、色々簡単に出力するヘルパー関数やfor文を簡単に書くための大量のマクロを定義していたり、本質的に実力が上がることはありませんが、問題解く気が起きないときにチマチマ作っておくと問題解く気になったときに時短ができる……かもしれません。
環境はWSL2-Ubuntu24.04で、C++でローカルホストサーバを使うためにnginx入れてCrow使ったり、分割しているテンプレファイルを結合した状態でクリップボードにコピーするプログラムを書いてたりと、ちょっとややこしいです。
余談、キーボードとVim拡張の話
個人的な話になりますが、キーボードはREALFORCEの標準的なJIS配列を使っています。(以下の話は変換と無変換が押しにくい位置にあるキーボードだとなかなか難しいと思います)
Auto Hot Keyで変換キー+HJKL(とかWASD)で矢印の代用にしたり、windowsのIMEの設定で無変換キーをIMEオフに割り振ることでちょっと便利になると思ってます。
英語入力したいときは無変換を押してから始めればいいし、日本語入力をしたいときは無変換を押して、次にCapsLockを押してから入力を始めるとよくなります。
タスクバーを自動で下げるようにしていると、旧IMEであった[あ/A]の表示が無くなってちょっと不便だったので、タスクバー自動下げ勢の皆さんは使ってみてください。
CapsLockとCtrlを入れ替えてる人だとIMEオンにするために全角半角キーを押すかCtrlキーを押さないといけないのでどっちにしろ大変だと思います。
あと、VScodeにVim拡張を入れて、inoremap @@ <ESC>
と同じ動作にしておくと便利になると思います。
ノーマルモードに戻るときにjj
が使われることが多いらしい(未検証)のですが、競プロだとj
をよく打つので次の入力町になられると画面上でカーソル表示がズレて少し気持ち悪いです。
@
はほとんど使うことないし、使うときもメアドとかで1個なので、2連打できなくて困ることはありません。
Vim拡張を入れているとCtrl+w h
などで、編集中のタブから左のアウトラインなどに移動できるので、ターミナルを左に置いておくとキーボードから手を離さずにテスト実行できます。
(ただしテストをコマンドで一括実行できる環境に限る)
戻るときはCtrl+Tab
で開いている編集中のタブを選択できます。
セグ木とかmodintはACLにあるのでそっちを使いますが、union findは自作ライブラリのほうを使うことが多いです。特に理由はないです。
一応書いて置いているけど、持ってること忘れて本番中に普通に書くことが多いので、これを持っている意味があるのかはよくわかりません。
拡張機能を入れる
-
AtCoder ACer
問題一覧でAC数を見ることができる -
Solve Later Again
Problemsで後で解きたい問題にチェックを付けられる -
ac-predictor
順位表でコンテスト中や後にパフォとレート増減の予測を見れる -
Atcoder AC Submission Duration
順位表で次の問題をACに前の問題のACから何分かかったかを見れる -
AtCoder Jump to Submissions from Standings
順位表からACコードに飛べる -
atcoder-difficulty-display
問題ページ、問題一覧でdiffが見れる -
atcoder-standings-difficulty-analyzer
コンテスト中のdiffの推移が見れる -
AtCoderColorStandings
順位表でレート当たりの正答率が見れる -
AtCoderStandingsAnalysis
順位表で問題ごとに提出者数、正答者数、ペナ率、平均ペナ数、内部レート分布が見れる
順位表関連の拡張機能はかなり重めなので注意。
競プロをサボる
茶から緑まではかなり熱心にやってたような、やってなかったような気がしますが、それ以降は伸びが緩やかになって熱量が落ちてきました。
やる気が起きないときは適当に関係ない本読んだり、一家に一台落ちてるデュアルXeonのUbuntuマシンの盆栽プログラムをつついたりしてると1週間くらいでまた戻ってきます。
オライリーの実用Gitとかはかなり良かったですよ。
競プロのやる気が0の時に調子に乗って本をいっぱい買うとすぐに競プロに戻ってしまって積読が溜まる一方なのでほどほどにした方がいいです。
大事なこと
緑になってから何回か冷えました。
この時は例外なく睡眠不足などで体調不良でした。
私は人と会うことが無いフリーダムぼっち大学生なので生活リズムは大破壊しても問題ないため、頻繁に大破壊しています。
その結果、睡眠不足から抜け出せず連続で冷えるなどと言う愚かな失敗を何度かしています。
ちゃんと寝ましょう
その次に大事なことは毎週出ることですかね。
冷えるとかなり腹が立ちますが、キレながら精進すると割と続きます(人による)。
ABC350(2024/4/20)から毎週出てたらちょっとずつ伸びてたので、続けるだけでいい感じに実力はつくのかもしれません。
ただし私が超暇大学生なので精進の時間に都合を付けれたという側面はかなり強い
今後
とりあえず、次のABC383で冷えて緑に逆戻りしないようにしたいです。
個人的には実力の足りなさはひしひしと実感しているので入水したからどうしたって感じです。
ARCの緑diffは全く歯が立たないし、水diff以上の問題は山ほどあるので、私はまだまだAtCoderの半分も楽しめてないです。
もったいないじゃないですか。私にも天才以外お断りパズル解かせてくれよ!!!
そのためには実力をつけるしかないので、それはまぁ……。
元々、年内に入水するという目標を立てていたので、それを達成できたのはよかったと思います。
目標自体は入緑した直後に、年内に入水できるだろうと思っての楽観的な放言だったのですが、思いのほかギリギリになってしまって最近はちょっと焦ってましたが、無事目標達成したので一安心。
元々言い出したのは私じゃないですし、文面に残る形で言ってはいない(多分)のですが、文面に残る形で書いちゃった友人たちはあまりABCに参加しておらず……。