私立文系大学生がAtcoderで青になるまで
Atcoderで青になって水に落ちて青になって水に落ちてまた青になりました!
自己紹介
- 私立大学文系学部(経済学部)の4年生
- 数学はちゃんとやったのは1A2Bまで、高校時代に数Ⅲを少しやった*1
- プログラミングは大学に入って初めて触った*2
- 今のところプログラミングを書く仕事に就く予定はない
- 言語はC++
- グラフをみるとわかる通り、カタツムリ精進です
レートと精進
Atcoderでは2022/2/21現在957題解いていて、内訳は以下の通りです。3年ぐらいかけてダラダラダラとやっていて、2021年の5月ぐらいからちょっと精進してまた最近ダラダラしてます。
5月ぐらいからは主に試験管のついていない緑埋めをやっていて、それの目途が付き次第水色を解いていました。
ライブラリ一覧
・combination
・繰り返し二乗法
・ダイクストラ法
・素因数分解篩
・Union-Find
・トポロジカルソート
・行列累乗
・ローリングハッシュ
・ACLいろいろ(特にsegtree,modintには大変お世話になっています)
結局ACLが便利すぎるので自分ではあまり整備していないです。
緑→水
とにかく緑・水diffの問題を埋めていました。競技プログラミングの基礎知識が全然みについていなかったので、いろいろ問題を解くことで知識をつけるとともにそのアルゴリズムがどう動いているかを理解しようとしていました。(例えばDFSがどんな順番で探索しているかのイメージがすぐに思い浮かぶか?等)これのおかげでアルゴリズムを言い換えただけの問題や、明らかにこれつかってくださいね~みたいな問題は瞬殺できるようになりました。これとか。*3
水→青
知識面ではセグ木・遅延セグ木・フローの3つが大きかったと思います。これによって解ける問題の幅がだいぶ広がりました。
しかし、この3つが使えたから青になれたかというとそんなことはなく、どちらかといえば思考の細やかさみたいなところが強化されたような気がします。
例えば、F - Make Bipartiteを解くにあたって高度な知識が必要かといわれるとそうではないと思います。こういう問題に対して、ちょっと図を書いたりぽえぽえしてみたりしながら考察を進められるようになったのが青になれた最大の要因だと考えています。もちろん黄色やさらにその上を目指すにあたっては、ABCのGHレベルの知識と理解は必要ですが、青になるだけならABCのGHレベルの知識はあまり必要ないと感じています。
コンテスト中のおすすめ
コンテスト中にお茶を飲みに行きましょう。
EFあたりの問題だとまだ問題を見てもすぐに解放が浮かばないんですが、とりあえずお茶を飲みに行くとわかることが結構あります。頭を休めることがいいのか動くことがいいのかそれとも別の要因*4なのかわかりませんが、パソコンの前で云々うなって椅子をあっためるよりはマシと自分の中で結論付けています。
逆にやめたほうがいいことは、いつまでもコードテストを使い続けることです。今でもコンテストはコードテストを使って出ているのですが、どう考えてもClionとかに慣れたほうが効率がいいです。早くClionに慣れないとなぁと思いつつここまでやってしまいましたが、早いうちからIDEに慣れておいたほうがその後のコーディング人生が豊かで実りあるものになると思います。
競プロとの向き合い方
レートが上がらなくても死ぬわけじゃないので、気が向いたときに少しずつやっています。そのため青になるまでに4年ぐらいかかりました。特にダラダラやっている時期は、「実力が付けば今の失敗は無傷」の精神でレートをガンガン溶かしていました。現状競技プログラミング以外でプログラミングを書くことがなく、趣味の1つとして捉えています。
文系で競プロをするためのコツ
以下のまとめ
・生きてるだけでノーコストで入ってくる知識、割と大事
・文系でただ生きていても競プロの知識はあまり入ってこないので、入ってくるように環境構築すると競プロがやりやすい
最近、生きてるだけで得られる知識(特にそれを意欲的に学ぼうとせずとも得られる知識)の積み重なりはバカにならないな、と感じています。TwitterのTLから得られる情報や、とりあえず単位を取るだけ取った学部の必修などがこれに当たります。たとえ遊びたくて大学に入った人であっても、四年間ある程度まともに単位を取り続けていたら少しは専門的な知識が身につくだろうし、もう一度それを学ぼうとした時に初学の人に比べてとても容易に学ぶことができるはずです。競プロで言えば、TLに流れてくる解説や用語の説明をダラダラ眺めているだけでも、実際にそれを学ぼうとした時の労力は大幅に減少すると思います。*5その点において、周りの環境がどうであるか、特に生きているだけでどのような知識が入ってくるかは重要であると考えます。
ざっくり文系学部で生きてると競技プログラミングに付随する知識がほぼ入ってきません。競技プログラミングに付随する知識とは、直接的にはプログラミングのお作法や様々なアルゴリズム等を指しますが、ここでは広く競技プログラミングをやるにあたって必要な事項、数学的な記法や整数問題の知識等、を含めています。
直接的な点においていえば、文系学部においてもプログラミングの授業はあります。しかし、初学者向けの講座であるため、特段アルゴリズムについてやるわけではありません。そのため競技プログラミングという視点からみると、とても役立つとは言い難いです。もちろん、プログラミング事始めとしての受講は有用だと思います。
問題を解くにあたって解説を読む機会がたびたび現れますが、その中には「数学語*6」で書かれた文章が出てきます。数学語は正確で明瞭である一方、その表記に慣れていないと意味を理解するのに時間を要します。多くの文系の学部ではあまり数学を使いません。経済学部では多少数学を用いる機会はありますが、特に意欲的に数学を学ぼうとしない限り、理系に比べてその機会ははるかに少ないです。*7始めたての頃は特に解説読んでも理解できないことがしばしばありました。
結局、文系の人は理系の人以上に周りの環境構築に気を配った方が良いということです。例えば東大理系学部の人は須く競プロをやっている*8と思いますが、そんな環境は滅多にありません。そのため、競プロのサークルに入ったり、TwitterのTLを競プロerで埋め尽くしたアカウントを作ったりして低コストで競プロの知識を仕入れることのできる環境整備を積極的に行いましょう。僕の場合は周りの友達がみんな競プロをやっていたためする必要がなかったのですが、それがなかったら青までやっていなかっただろうし、そもそも競プロを始めていたかもわかりません。振り返ると、大学の入試を文系という区分で受けるうちに、無意識のうちに視野を狭め、「出来ること」「出来ないこと」をその枠組みの中で定めてしまっていたように感じます。それに気づかぬままに、自然と競技プログラミングという理系寄りなことが出来たことは幸運だったと思います。