【色変記事】Web系一般高校生が緑コーダーになるまで

# 自己紹介

ZOIといいます。記事作成時点では高2です。
学校の部活でWebページ作ったり色々してました。
努力嫌いの飽き性です(なんだそれ)

2023/2/19のABC290で入緑できて嬉しいので色変記事書きます。

> 注: AtCoderでは、色が変わった時に「色変記事」と題して長文をネットに晒してもいいらしいです。何も考えずに書いたせいで、自己満足のポエムでしかないですが...もしよければ読んでみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677057/73b2a7f3-036d-e140-05fd-38df70ae5186.png)

<!--

# AtCoderを(まともに)始めるまで

僕の初参加は2019/11/24のABC146らしいです。中2の最後の方ですね。
残念ながらなぜ参加したのかは覚えてないです...

グラフを見てわかる通り、まともに参加しだしたのは2022/11からです。
とりあえずそれまでやっていたことを書いてみます。

## 小学校

<details>
    <summary>長いので折りたたみ</summary>

僕はなぜか小学校からパソコンを触ってました。

工作が好きだったのですが、ミニ四駆とかいじってるうちに小3くらいで電子工作に目覚めました。
始めは電池と抵抗とLED繋げてニコニコしてるくらいだったのですが、少しすると光センサみたいなの使ってライントレースカー?的なものを作ろうとしました。電力不足などなどで走りませんでしたが、トランジスタの使い方とかは最低限把握しました。

ある時、「大人の科学」という雑誌を買ってもらったとき、付録としてArduino互換機がついていました。本に書いてあるコードをコピーして遊ぼうとしましたが、当時はコメントすら理解しておらず、「ここには英語で説明を書かないといけないらしいけど、英語分からないから書けない...」みたいなことで悩んでました。なんだそれ。

その後、父親がRaspberry Pi 2Bを買ってきてくれたのでマイクラして遊んだりしました。LED制御くらいしようと思いましたが、キーボードと違う文字が入力されるなどであきらめました。

その後、Minecraftというゲームにハマりました。飽き性なので家を作る前に次のワールドに移っていました。友人も数人やっていたのでマルチプレイをしようと思い、サーバーを建てようとしましたが、圧倒的な知識不足により成功しませんでした...

</details>

## 中学校

<details>
    <summary>長いので折りたたみ</summary>

なんか面白そうという理由で物理部に入りました。運動部は選択肢にすらありませんでした...

物理部のほとんどは幽霊部員で、わずかに来た人は宿題するか紙飛行機を飛ばしているというゆるい雰囲気でした。

この頃にはマイクラのサーバー建てにも成功していたので、友人とmodを100個くらい入れた環境で毎日マルチプレイをしていました。

文化祭ではごく簡単な工作をしたり、まあだいぶのんびりした生活をしていたのですが、いつの間にか部室の後ろ半分を知らない人(同級生なのですが)が占拠するようになっていました。中1の3学期くらいだったと思います。

その団体(4人くらい)は「PC同好会」と名乗っていました。
迷わず入部しました。聞けば、同級生2人が新設した団体だそうです。すごいなあ

マイクラをやっていた友人はラノベオタクだったので、SAOのmodを作れないかと仕様書を渡されました。そこでJavaを知らないままIntelliJを入れました。クソコード(クラス分け無し1ファイル)でしたが、一応動くものができました。

その後、2年の1学期に灘校の文化祭があると聞きました。関西でそんなに遠くなかったので遊びに行きました。
その年のテーマは「SAIL AWAY」、そして灘に詳しい人なら知っているかもしれませんが、この年からデザインが異常にハイレベルなものになったのです。

このパンフレットのデザイン、Appleのホームページかと思うような美しいWebページに強い衝撃を受けました。こんなものを高校生で作れるのか、と。

すぐにWebデザインの本を買い、Web制作を開始しました。

中2、3の文化祭はWebページを作ってました。中3はなぜかパンフレット制作と動画編集もさせられましたが...

これとかですね

https://twitter.com/ZOI_dayo/status/1156910425050456065

中3くらいになるとマイクラでのフレンドもでき、とあるYouTuberがやっていた企画を勝手にパクったプラグインを作って毎日遊んでました。バグだらけでしたが運用でカバーしました。
参加者の皆さん、バグのときはすみませんでした...

この頃にAtCoderに初参加したそうです。当時のTwitterには何も投稿されていませんでした...
おそらく、弟の友人が競プロしてると聞いたのが原因だと思います。当時は「プログラミングで勝負するなんてそんな野蛮な...」とちょっと否定的でした。やってみたら楽しかったです。

あと、2019/11/11頃にPC自作しました。コンピュータ内部の理解に結構役立った気がします。

</details>

# 高校

引き続きPC同好会にいました。カメラにRaspberry Piくくりつけてタイムラプス撮影(20Hくらい)したり、文化祭予算でRspi4を買って文化祭HPをホストしたり色々しました。Nuxt.jsとかも使うようになりました。

Webサーバー構築には、マイクラサーバー構築のネットワークの知識が生きました。Nginxのコンフィグと格闘です。

その後、Web系のイベントに出たり色々してましたが、競プロは1年に1回くらい思い出して参加する、くらいでした。

理由は色々あるのですが、一番大きかったのは自信の不足だったと思います。周りに緑コーダーとかはいましたが、自分が灰色で停滞している(参加してないので当たり前ですが)ので「僕にはアルゴリズムの才能はない」と思ってました。

しかし、競プロへの意欲が再燃するきっかけになった出来事がありました。会津大学が主催する「パソコン甲子園」という大会への出場です。

この大会には「プログラミング部門」という競プロの部門と、「モバイル部門」というスマホアプリを作る部門があります。(絵を描く部門もありますが省略)

競プロには多少アレルギーを持っていた感じなので、もちろんモバイル部門での参加でした。この時に、プログラミング部門で1位を取った方々(同級生)と少しだけ喋る機会があったのです。

目の前にいて、普通の同級生に見える人が、競技プログラミング日本一であるというのはかなり新鮮な体験でした。僕はかなり楽観的なので、「彼らが全国一位になれるなら僕も茶色くらいにはなれるはずだ!」と考えました。無茶苦茶ですね。

そして帰宅後、何か解説書を買ってみることにしました。その時点ではfor/while/array程度ならわかるものの、競プロ以外であまり目にしないような「グラフ」「木」「計算量」あたりの知識が皆無で、そのままではWeb上の解説すら読めない状況だったからです。

せっかく本を買うなら長く使えるのがいいな、と思って選んだのが、「蟻本」

-->

# 競プロ再開

グラフを見てわかるように、2年半ほどほとんど参加していない時期がありますね...

なぜ競プロを知ったのか、始めたのかはあまり覚えていないのですが、再開したきっかけは結構明確にあります。
2022/11/5~6に行われた、「パソコン甲子園」です。もちろんこの時点では競技プログラミングなどできないので、スマホアプリを作る部門での参加でしたが、なんか色々あってプログラミング部門の1位の方々と話す機会がありました。
僕は基本的にポジティブ、というか都合の悪いことは気にならないタイプなので、彼らが天才であることは忘れて「僕でもやってみたら伸びるんじゃね?!」と考えました。改めて見るとひどいですね...

帰宅後、とりあえずコンテストに出てみることにしました。もちろんテンプレもなく、Web開発などで使っていたVSCodeを引っ張り出してきました。11/12、ABC277です。
グラフを見て分かる通り、上がっても下がってもいませんでした。まあやってないので当然です。

12:30での2完でしたが、この時から「解けなかった問題を見直す」ということを始めました。これがめちゃくちゃ効果的でした。(勉強でもできたらいいなあ)

この時のC問題、「[Ladder Takahashi](https://atcoder.jp/contests/abc277/tasks/abc277_c)」の解説を見た時の衝撃は、強く印象に残っています。

まずこの時の[僕の回答](https://atcoder.jp/contests/abc277/submissions/36469326)(WA)を見てみると、どうやらDPは理解しているらしい(PCKからの数日でナップサックDPを履修したんだと思います)、そしてなんかネットから貰ってきた座圧を張り付けてますね。まあこのやり方ではTLEです。

[テキストでの解説](https://atcoder.jp/contests/abc277/editorial/5209)もありますが、まず1行目からわかりません。グラフってなんだ、折れ線か?という感じです。そこで、[公式の解説放送](https://www.youtube.com/watch?v=thDkAUUi1UI&t=1917s)を見てみました。snukeさんが解説してくれるやつです。

この動画を見て、やっとグラフを理解することができました。それまでは、なんでいきなり問題文に「木」「葉」が出てくるんだ、という感じで、出てきた瞬間詰んでいました。そして、stackやqueueの使い方、DFSやBFSがいかに天才的かに感激しました。
あれ考えた人凄すぎますね... 他のことを気にせず、TODOが余っている限り簡単な操作を繰り返すだけでいつの間にか木の全域を効率よく調べているわけです。天才です。

# 競プロへの没頭

はい。お分かりの通り、この段階ですでにめちゃくちゃハマってます。

元々自分の書いたコードがあまりにもひどい(探索は基本全探索、アプリを作ればカクつく、処理を書けば実行時間お化け、etc...)のは察していたのですが、それらを解決する手法が目の前に現れたのです。飛びつくしかありません。

ただ、競プロの世界は化け物(褒め言葉)だらけです。強い人の多くは東大/京大に在籍しているらしく、解説も「数学は知ってるだろ」という空気感です。流石に独学は無理だと確信しました。

そこで本の購入です。この時点で、競プロの本として聞いたことがあったのは、「プログラミングコンテストチャレンジブック」...いわゆる「蟻本」だけだったので、迷わずKindleで買いました。

後から知ったのですが、蟻本はかなりハイレベル帯向けの本です。灰コーダーが読むべきものではないです。後で出てきますが、「鹿本」(簡単)、「螺旋本」、(中級)「鉄則本」、(初級〜上級? 読んでないのでわかりません)のいずれかから読み始めるべきです。最悪わからなさすぎて競プロが嫌いになってしまいますし、あの本はAtCoderのできる前の本なので、出典も英語です。

おそらく、蟻本は「ガチ勢東大生がプログラミングしてる東大生に布教するための本」です。気をつけましょう。

まあなんだかんだあって、蟻本を買いました。中の問題は全くわかりませんでしたが、解説を流し読みしてました。

前回からグラフなどの知識も増えたおかげで、次のABC278(11/19)では4完できました。突然すぎる...!

ここからレートが伸び始めます。次のABC279(11/26)では、微分を駆使してDを、その後20分でEを解くという圧倒的成績で入茶しました。この時のパフォーマンスは、現時点でもまだ超えられていません。何でやねん。

# JOI

ちょうどその頃、学校にJOIのポスターが貼ってあったため、友人2人と一緒に受けてみることにしました。全員が初心者だったため、過去問を見ても誰一人わからんという感じでした...

1次予選は、11/19にあったのでそれに参加しました。時間が微妙だったので学校帰りにマクドに寄ってそこでカタカタしてました。
18:15で全完しました。ある程度早いかなと思ったのですが、Twitter上に1分台などがいらっしゃって恐怖してました。

問題は2次予選(12/11)です。JOIは、1次予選は初心者Welcomeという雰囲気なのに対して2次予選は現実を突きつけてきます。部分点はあるものの、難易度が異常に高くなっており、倍率は10倍くらいあります。結構頑張ったんですが、100-77-9-6-0で192点でした。

Twitter見てる感じボーダーは250くらい?と言われていたので諦めてましたが、実際のボーダーは208点以上でした。思ったより惜しかった? まあ不合格には違いありません。さよなら...

# 今に至る

そしてそのまま続けて今に至る感じです。といっても所々変わっています。

## 参考書

蟻本は難しすぎたので、「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造」、いわゆる「螺旋本」を1/26に買いました。とても読みやすいです。

また、弟への布教用に「アルゴリズム的思考力が身につく！ プログラミングコンテストAtCoder入門」、いわゆる「鹿本」を買いました。初心者が始めに読むならこれが一番だと思います。

一応、現時点でわかってる(と思っている)のはこんな感じです。

- 線形探索
- 2分探索
- bit全探索
- 単純無向グラフ
- DFS
- BFS
- Union-Find
- トポロジカルソート・判定
- しゃくとり法
- 累積和
- ナップサックDP
- ラムダ式
- 三項演算子

逆に、下に書いているのはあんまりわかっていないです。(わかってない分野なので、似たようなものも入っているかも...)

- セグ木
- 半分全列挙
- 区間DP
- 桁DP
- 中国剰余定理
- mod除算
- ダイクストラ
- ベルマンフォード
- 最小全域木

## 環境

初めから変わらずMacbook Air(M1)です。キーボードも本体のものを使っています。昔からパンタグラフしか使ってこなかったので、外部キーボードは逆に遅くなるんです...

また、僕はあくまで技術オタク、つまり「何かを自動化すること」に強い喜びを感じる人間なので、当然提出などは自動化しています。具体的には、「online-judge-tools」と「[atcoder-cli](https://github.com/Tatamo/atcoder-cli)」を使いました。

また、以下のようなエイリアスも作っています。

```bash
alias g++-atcoder='g++ -I ~/Documents/AtCoder/include -std=c++17 -O0 -g -ftrapv -fstack-protector-all -fno-omit-frame-pointer -D_FORTIFY_SOURCE=2 -D_GLIBCXX_DEBUG'
alias g++-atcoder-fast='g++ -I ~/Documents/AtCoder/include -std=c++17 -O0 -g'
alias oj-test='g++-atcoder-fast main.cpp && oj t -e 1e-6'
alias acc-submit='acc s -s -- --no-open --yes'
alias acc-check-submit='oj-test && acc-submit'
```

なんかネットで調べて出てきたオプションを書いたり、よく使うコマンドをまとめただけです。真似したら使いやすくなる、というわけではないと思います。

## エディタ

少なくとも再開してからはC++(gcc)でやってきているので、初めはVSCodeに拡張を入れて使っていました。ただ、途中から技術オタク厨二病を発症してしまい、現在はNeoVimを使っています。

NeoVim、というかVimをご存知ない方のために軽く説明すると、Vimは最古参レベルのテキストエディタです。だいたい1988年からあります。Windows95より前です。ちなみに僕は全然生まれてません。怖いねー

操作に多少慣れが必要ですが、マウスを使わず操作できるため慣れるととても早いらしいです。僕の場合は思考が遅いのでそんなに変わりません。悲しい...

そんなVimを多少機能追加したのがNeoVimです。違いはほぼないです。

Vimは昔のエディタなので機能が少ない、という印象を持たれると思いますが、プラグインで機能拡張ができます。過去数十年のプラグインが積み上げられてきているので、ほとんどのことはできてしまいます。

こんな感じです。([Neovideに勝手に背景画像機能を付け足したもの](https://github.com/ZOI-dayo/neovide_bgimage)を使っています。アズサちゃんかわいい。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677057/0a39f4ff-e8b0-6fab-3b7f-530315d2ec04.png)

エラー表示とか補完とかめちゃくちゃ早くて助かってます。

こんな感じのプラグインを入れてます。

| プラグイン名 | 説明 |
| --- | --- |
| Jetpack | プラグインマネージャ |
| iceberg | 綺麗なカラースキーム |
| lightline | 画面下部が綺麗になるやつ |
| Fern | 画面右側のファイルツリー |
| indentline | インデント表示 |
| ddc.vim | 補完 |
| mason.nvim | LSPとかのインストール画面 |
| nvim-treesitter | コードのハイライトが綺麗になる |
| telescope.nvim | ファイル検索などなど |

前提プラグインとか機能追加とかは省略しています。これ以外にもいろいろあるのでぜひ探してみてください。

## メモ

ある程度難しい問題だと頭の中だけでは手に負えなくなるので、何かメモのようなものを用意したほうがいいです。

初めはiPad+Apple Pencilとか、mac上のFireAlpaca+ペンタブとかいろいろやってましたが、結局慣れているルーズリーフ+シャープペンシルが最強でした。紙の大きさは限られてるけれども次の紙使えばいいし、なんだかんだ言って一番細かく書けます。

## Chrome拡張

### Tempermonkey

なんか色々な拡張機能(スクリプト)を入れれるやつです。おそらく、ページロード時にJSコードを埋め込んでいるんだと思います。

AtCoder用のやつをたくさん入れました。入れすぎて覚えてないですが、とりあえずコンテスト中に予想レート見れるやつとかは便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677057/f9d8e065-6443-568d-c875-ce9e5737f8bc.png)

## その他

マウスはVimのお陰でほぼ使わないし、ルーズリーフ置きたいので使ってません。

アプリ(といってもChromeとNeovideだけですが)はどちらもフルスクリーンにして、トラックパッドで動きながら使ってます。ウィンドウだとごちゃごちゃして苦手です...

# 精進

競プロ界では、レートを伸ばす=精進(過去問埋め)というのが一般論っぽいのでなんか喋ろうと思ったんですが、時間がなくてほぼ精進をせずに来たので何も喋ることができません。(ええ...)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677057/e97ea27c-7443-6d8e-81bc-d6c563f732df.png)

はい...精進グラフ、灰です...

流石にそろそろやらないとまずい気がしてきました。登下校の時間でできたりしないかなあ?

# 最後に

というわけで、入緑色変記事として、僕が競プロを始めた(再開した?)時から今の環境までをだらだらと書いてみました。

実は1年後には受験なので競プロばっかやってる場合なのかは諸説ありますが、「レート変動チャンスが1週間に1回しかない」ので、他のゲームとかよりは時間を溶かさないはずです。きっとそうです(現実逃避)

まあすぐにでも再入茶しそうな感じはありますが、ぼちぼち頑張っていこうと思います。

それではみなさん、良い競プロライフを!