TERRYのブログ

最近は競技プログラミングにお熱。

Sponsored Link

AtCoderで黄色になりました

企業コン、コンテスト名が長すぎませんか?

はじめに

黄色になりました。3月までになりたいなあと思っていたので、内心非常に嬉しいです。 下手すると最後の色変記事になるかもしれない*1ので、今までに感じたこととかを書いておこうと思います。

一応自己紹介しておくと、機械系卒メーカー勤務5年の14歳社会人JCです。過去の色変記事はこちら。

www.terry-u16.net

www.terry-u16.net

レートとか精進量とか

お約束系一覧。最近本業が忙しくなってきて精進をサボりがちです……。

年明けたあたりからAtCoderのレーティンググラフがガタガタなんですが、これについては後述。

f:id:terry_u16:20210228234927p:plain

f:id:terry_u16:20210228234837p:plain

f:id:terry_u16:20210228235016p:plain

f:id:terry_u16:20210228235137p:plain

やってよかったこと

集中して問題を解く時間を設ける

まあ当たり前ですね。ただ、人によって集中できる精進方法は異なるので、自分に合ったものを見付けるとよいでしょう。

自分の場合はバチャ形式が適していました。時間を区切って集中できること、併走してくれる方との競争意識が芽生えることあたりが良かったように感じます。

よく参加していた*2のはえすえふ(@sf__eng)さん主催のCodeforcesバチャで、こちらは概ね毎日夜9時頃から2時間ほど開催されています。併走者も多くオススメです。

sf-eng.hatenablog.com

もしくは手前味噌ですが、同じく夜9時からAtCoder Problems上で立てさせて頂いている*3くじかつですかね。未だに多くの方に参加頂けているようで嬉しいです。

www.terry-u16.net

バチャに限らずとも集中できる方法であれば何でもよいとは思いますが、いずれにせよ時間を区切って、なおかつ自分の適正レベルよりちょっと上の問題まで取り組むのがオススメです。

考察ノートにめちゃくちゃ書きまくる

精進方法というより問題を解くときのコツなんですが、自明っぽいことでもどんどん書き殴っていくとふと問題の本質に気付くことがあります。書いていくうちに思考が整理されていくのかもしれません。

ちなみにノートに書くときは文字や数式だけではなく図を交えて書くのがオススメです。自分の場合、問題文を読みながら図に起こしたりもします。図は言語処理なしにダイレクトに脳に飛び込んでくるので強いです。脳のリソースの節約にもなります。

問題から学んだことを言語化して残す

精進は何のためにするのでしょうか。もちろん純粋に問題を解くのが楽しいという面もありますが、実力の向上という観点から見るのであれば、問題から何かを得てコンテスト本番で活用できるようにするためだと自分は考えています。

特に自分の実力より上の問題を解いた後は、何かしら得るものがあったと感じることが多いと思います*4。その学びを次のコンテストに活かすため、問題の内容を抽象化・言語化するのがオススメです。一見ad hocでもよくよく考えると他にも応用できそうな考え方が見付かったり、言語化する過程でよく分かっていない点に気付かされたりと、問題をちゃんと理解する上で結構効果的だったように感じます。時々読み返して記憶の定着も図れますしね。

ちなみに、自分は1時間くらい考えても分からない問題は解説ACをしていました。知らないアルゴリズムはもちろん、知らなかった考察の典型なんかも言語化して頭に叩き込むようにしていました。もしかしたら、そうやってストックしてきた知識が無意識のうちに役に立ってきた面もあるかもしれません。

ライバルを見付ける

個人差はあると思いますが、一部の天才を除いて青から黄色になるまでにはそれなりの長い期間が必要になります。そうするとモチベーションの維持がだんだん大変になってくるんですが、モチベーションの維持に有効なのがライバルです。

Twitterで競技プログラマをフォローしている人も多いかと思うんですが、自分の場合実力向上に一番効いたのはトップ層ではなく、同レベル帯のフォロワーさんでした*5。個人的に一番良かったのは一緒にバチャを走ることですね。それでなくても、同レベル帯の人が精進しているのを見ると自分もやらなければという気持ちになりました。

人間は*6怠惰なので、放っておくとだんだん怠けてきます。使えるものは上手く使って、精進したくなる環境を整えていきましょう。

やらなくてもよかったこと

実力を上げたいなら、「全て」をやるとよいでしょう。とはいえ時間は有限です。ですので、やらなくてもよかったかなと思ったことについても書きます。

あくまで「レーティングを上げるためにはやらなくてもよかった」と自分が考えていることです。無駄だったとは思わないものもありますし、むしろレーティングには関係ないけれどやって良かったと思うものもあります。少なくともマイナスに働くことはほとんどないので、最大効率を求めない限りはあまり気にしなくてもよいかもしれません。

低難易度をたくさん解く

これ、青になるくらいまではかなり有効だと思うんですが、黄色を目指すときはちょっと考えた方がよいです。こうなります。

f:id:terry_u16:20210228235812p:plain
橙色の枠がARC級コンテスト

f:id:terry_u16:20210301000104p:plain
https://rating-history.herokuapp.com/rating.html

これはひどい。

くじかつみたいなバチャをやるとだいたい低難易度の問題が付いてきて、これを解くとパターンマッチ的に高速に解く力は付くんですが、残念ながら考察力はあまり付きません。格下の問題でも解けば当然ACと表示されるので、精進したつもりになってしまうのもよくないです。

だいたい水~青になるまでは典型をしっかり押さえるために数をこなすべきだと思うんですが、そこから上は考察力の比重が高くなってくるので、精進方法を見直すべきだったなあというのが今までを振り返っての反省です。反面教師にして頂ければ幸いです。

データ構造/アルゴリズムの勉強をする

青になってから勉強した新しいデータ構造/アルゴリズムは以下の通りです。が、青までに覚えたような頻出のデータ構造/アルゴリズムに比べると、費用対効果はだんだん悪くなってきますね*7

アルゴリズム

  • フロー
  • 中国剰余定理
  • 強連結成分分解
  • 2-SAT
  • FFT
  • SA-IS
  • HL分解

データ構造

  • 赤黒木*8
  • SWAG

まあ結局勉強しちゃうんですけどね!新しいことを学ぶのは楽しいので。

ACLへのコントリビューション

公式のACLはC++版のみであり、C#版はありません。ないものは作ろうということで、C#版ACLの整備に参加していました。

お恥ずかしながらgithubで開発に参加するのは初めてだったので、色々勉強させて頂きました。さすがにレーティングに結びついたという実感はないですけどね。とはいえACLがないとコンテストで死ぬので、そういった意味ではレーティング上げの役に立ったと言えなくもない……?

マラソン系コンテストへの出場

これはかなり危険です。休日1日が溶けるのは日常茶飯事、下手をすると1週間が平気で蒸発します。ああ、こんなところに被害者の日記があります。怖いですね。

www.terry-u16.net

ところで今週末からAtCoder Heuristic Contest 001というコンテストが始まるみたいですね。沼にハマると怖いみたいですが、1回だけなら大丈夫なんじゃないでしょうか。記念すべき初回コンテストですし。説明文にも「腕に覚えがある人も、まだまだプログラミングは始めたばかりという人も、一度参加されてみてはいかがでしょうか?」とありますし、きっと初心者にも優しいコンテストなんだと思います*9。ね?1回だけ、1回だけやってみません?

atcoder.jp

最後に

突然ですが、競技プログラミングをやっていて楽しいと思える瞬間は何でしょうか?

誰よりも早く正確に問題が解けたとき、手がギリギリ届くほどの難しい問題が解けたとき、コンテストで大成功を収めたとき、過去最高レーティングに到達したとき、新しいアルゴリズムやデータ構造を学んだとき、過去問を1つ1つ埋めていくとき、面白い問題が作れたとき、コンテスト後のTLでワイワイと感想を述べるとき……。人によって千差万別だと思います。どうかそれを大切にしてください。

楽しければ、続きます。続けば、きっと強くなります。

おそらく、トップ勢と自分とでは、見えている景色も楽しさの質も違います。ですが、それでよいのです。楽しさとは主観的なものであり、自分が楽しめてさえいればそれでよいのです。

もし最近競技プログラミングが楽しくないと思えているのであれば、一旦距離を置いてみるのもよいかもしれません。競技プログラミング以外にも、この世界には楽しいことがたくさんあります。そちらに熱中するのもいいですし、飽きたらまたふらっと戻ってくるのもよいでしょう。戻ってきたとき、また違う楽しみが見付かるかもしれません。

全力で楽しみましょう。

*1:実は青色に落ちることで再度色変記事を書くことができます。

*2:最近サボり気味です……ごめんなさい。

*3:@kenkooooさん、いつもお世話になっております。

*4:逆に言えば、これが感じられない問題は実力向上効果は薄いように思います。解くことが無駄だとまでは言いませんが……。

*5:もちろん暖色コーダー各位の知見ツイートなんかはそれはそれで非常に勉強になります。

*6:主語が大きくありませんか?

*7:もっとも入黄を決めたコンテストではEで中国剰余定理が、Fでフローが出たので、当然役に立つときは役に立ちます。知らなかったら全完が4完になっているところでした。

*8:C#標準の平衡二分探索木は色々と機能が不足しているので……。

*9:ネタっぽく書きましたがこれは本当にそう思っていて、マラソン系コンテストって間口が広いんですよね。トップを狙うなら別ですが、そうでなければ実は貪欲を書くだけでも問題によっては結構いいところまで行けちゃったりします。