12
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

10ヶ月停滞した大学生が、ある日突然黄色perfを出して入水しました

12
Posted at

前置き

2026年現在 大学三年生のtrueです。

始めてから13カ月、ようやく入水を達成しました。記念に自分が考えていることをざっくばらんに共有したいなと思っています。

他の競技プログラマ(以下競プロer)と異なり、自分の成長曲線はかなり特殊であるため、その観点で楽しんでいただければと思っています。

具体的には、参加してから10か月ほどずっと同じような成績で停滞していましたが、ある日を境に、突然下位黄色帯のperfしか出せなくなりました。

適当に読み飛ばしつつ、何かしら持ち帰っていただければ幸いです。

よろしくお願いいたします。

尚、これは私個人の意見であり、何かしらの母集団を代表する訳ではないことをご承知おきください。

自己紹介

大学ではコンピュータサイエンスを専攻していて、情報系の研究室で、塩基の自己組織化現象の計算モデルを扱っています。

Twitter: @aphelios_like

Github: TrueRyoB

可処分時間が多いことが、競プロにおける私の唯一の強みです。

一方で、弱みは多い模様です。

  • 異常に飽き性です。
  • 読み飛ばしが多いです。
  • 納得するまで次に動けません。
  • 感情によって成果の質が影響されやすいです。
  • 大学の交友関係において、競プロに興味を持ってくれる方がいません。

なぜ競プロを始めたか

そもそもなぜプログラミングを始めたかということからお話しします。

自分の家族はかなり各地を転々とするタイプです。社会に馴染む上で自分を定義するために、周囲の人間ではなく、自分という存在を、ただの憲法で保護された有機生命体ではなく、一人の人間とさせる軸を持つ必要がありました。

その軸に該当するのが、自己表現でした。自分は、今思えば、何にでも挑戦する素養こそありましたが、少し手をつけてみて、合わないと思えば、すぐにそこで切り捨ててしまう節がありました。その中には、例えばピアノや文字書きなどが含まれます。

プログラミングはかなり特殊でした。まず、ある程度の参入障壁があります。そして、機能美を求められている訳ではありません。あくまで、動けば、それで利用者は満足してくれます。最後に、反復修正がとても容易です。手先が不器用でも全然問題になりません。

このような性質から、自分は、多少の能力不足があっても、ある程度の成果を残せるであろうという観点から、プログラミングをいたく気に入りました。

これが高校二年生くらいの話で、それから隙間時間にwebアプリやミニゲームを制作するなどしていました。

大学二年生に差し掛かった夏のときに場面が移ります。

自分はとても困っていました。上記の持論は、自分が親に養われている立場であるからこそ成立していたのです。具体的には、自分以外にも、世界にはコードを書ける人がほぼ無限にいて、ソフトウェアの性質として、一回作られたものは再配布が異常に簡単であるという現実に対して注意を配れていないことに気づきました。同じ課題を認識していて、解ける人など無数にいます。その中から、あえて自分のが選ばれる理由は皆無でした。そういった競争社会の制約を無視できたのは、稼ぐ必要をそもそも認識していなかったためです。

そこで、我こそがと主張するための根拠ないし自信が欲しくなり、競技プログラミングという工程にて客観的な技術指標を得ようという成り行きになりました。

自分のレート遷移について

情報系の活躍の場は、競技プログラミング関連に限定されません。

伸びが停滞しているとき、自分が大器晩成型だと言い聞かせてリスクを取り続けるよりは、戦略的離脱する方がよっぽど合理的に思えました。

上位勢の思考パターンを模倣できたらとの願望のもと続けていましたが、幾ら練習を重ねても、参加当初から10カ月、成績が全く伸びなかったため、心が折れていました。

そのため、学生選手権という重要なコンテストを潮時だと捉えて、それまでに、圧倒的な成長を示す指標がなければ引退するという覚悟のもと過ごしていました。

そこで、最後の週で、急に、上位20%帯から3%帯へと、コンテストの成績が爆発的な変化を遂げたものなので、自分の無意識的な変化に大変驚いています。

コンテスト詳細

ABC462にて初めて6完をしました。

今までは、ずっと後一押しで5完が届かないという状態が続いていました。

当時は、引退前最後のABCと捉えていて、焦ることもなく、ただ目の前に出てくる問題を淡々と解き続けていました。

とても遠いと思っていた存在が、あっさり手に入ってしまい、あまり自分事のように捉えられない節があります。

ところで、そのABCの前には、認識している中だと、以下のような特殊イベントがありました。

1. メガベンチャーでの長期インターン

株式会社ユーザベースにて5月中旬から内定者インターンをしています。

通勤時間も含めると、毎日9時間は考えっぱなしです。

対して、大学では、完全に思考停止した生活習慣でした。

頭を使うことが常習化したことが、何かしら競プロに作用したのかもしれません。

2. ARCにて初の0完

ABCにて水perfを連発していたので、あまり調べもせずに、なんとかなるだろうと高を括って挑みました。

結果、茶diffのA問題がずっと解けず、論理的思考のろもなかったかもしれないと判明して、とても悲しくなりました...

ここで、自尊心が完全に消え失せたように思います。

3. 何も精進しない期間

このABC前の一週間の間は、競プロ以外のことに専念しており、streakを維持することも辞めていました。

この短期間のブランクが、もしかしたら精神状態の安定に繋がったのかもしれません。

複数のタスクがあると、どうしても片方のことを常に意識してしまい、常にやるせなさを感じる傾向にあるので、自分自身に説明責任を果たす必要があったのだと思います。

水色コーダーに対しての見方

結論から話すと、水色帯付近以上の人々はとても優秀だと思います。

chokudai氏のブログでは"日本のIT企業において、技術力がカンストしている"と評価されています。

自分は、あんまりこの論点に納得していません。別にAIでも同様の設計実装および説明責任を果たせるためです。

では、一体何を以て競プロerはすごいのか、或いは競プロを通じてどんな素晴らしいことが得られるのか。一般的に思われているものと違う可能性があるので、その正体について紹介します。

得られたこと

1. 思考のノイズが減る

問題設定に対して、忠実に取り組む必要性から、余計なことを考えないように思考傾向が矯正されたと感じています。

「集中力」とは、ちょっとニュアンスが違う気もしています。

メモなどの外部媒体に頼らなくても、DPの複雑な状態設計を組んだり、探索範囲の上界と下界を示すなどができるようになりました。

2. 体調管理ができる

競プロはスポーツです。

決められたタイミングに、自身の最良を再現することが、好成績を残す上で、とても重要になります。

強さを追求していく過程で、自己管理能力を磨く必要性が生まれてきます。

勿論、寝不足の日とかは、実装が一生できなくて、余裕で灰perfを取ってしまいます。

3. 手段ではなく目的主体になる

競プロerのライフサイクルとして、解きたい問題をぐっと睨んだ後に、問題設定のボトルネックに適切なアルゴリズムを起用するという工程が含まれます。

手段ではなく、目的が先導している好例です。

問題解決にあってはならない「手段からできる目的を狭めてしまう」という認知バイアスは排除済といった具合です。

得られなかったこと

以下は、自分が初学者の頃に期待していたものとその答え合わせになります。

1. アルゴリズムは問題解決における銀の弾丸

誤りです。

あくまで、計算量を落とすための実装の工夫に過ぎないと思っています。

ただ、離散構造に対しての考え方の土台としては、とても役に立ちます。

2. 自信

少なくとも、私にとっては、誤りです。

当たり前の標準が上がってしまうのは、時々精神的に厳しいです。

裏を返せば、課題感を意識できているという話でもあります。

3. 直感を厳密性をもって説明 および 再現できる

プログラムは、自然言語で書くことができません。

自分がやりたいことを操作に置き換えられて、初めて土俵に立てます。

そして、やりたいことが目的とずれている時、容赦なく不正解のラベルを押し付けられます。

ここで、発想を正しく設計する動機が生まれます。

...はずなのですが、自分はまだ理想まで程遠いです。語彙力が欠けていることや、単調性などの重要な性質の理解不足が原因に含まれます。

4. 不確定な状況への耐性

状況によります。

解法が存在するという前提があるからこそ、考え進めることができますが、そうでない場合は、中々厳しいです。

例えば、ヒューリスティック最適化で必要になる、自分で最良の状態を定義して、制約を設定するなどの素養は、まだまだ発展途上です。

5. 開発力

念のため記しておきます。

要件を満たす最小構成を設計するという能力を活かせるかもしれません。

ただ、開発において重要なのは、ロジックの構築ではなく、ドメイン知識と可処分時間の投資だと思っています。作るものにもよりますが、あまり競プロで培われる能力の比重は大きくありません。

競技プログラミングで強くなるためにするべきこと

他の入水記事では、よく具体な取り組み内容が紹介されています。

なので、自分は、代わりに、取り組む姿勢を一部紹介したいと思います。

1. 目標を作る

割と当たり前ではありますが、かなり重要です。

競技プログラミングのような、毎週実力の一部が見え隠れする形式の成果の解釈には、注意が必要です。

コンテスト結果に一喜一憂してしまっていては、本質的な取り組みの代わりに、自分の気分を立てるための表面上の取り繕いに走ってしまう可能性が高くなるためです。

そもそも、自分の努力の結果が反映されるのは、大体三カ月ほど要することが知られています。(出典不明)

自分は、目標値を固定することで、ある程度俯瞰して分散を把握することができ、まともにコンテスト結果や精進の効果を捉えられるようになりました。

この目標とは、成果目標と努力目標に分けて考えられるはずです。

自分は、成果目標を入黄としています。

そして、努力目標を「簡単を落とさない」としています。

前者の根拠は、あまりありません。コミュニティ内で上位に相当する「暖色」に分類されたかったという程度の動機です。

後者は、師匠に教えてもらいました。この文言を解釈し直すたびに、この重要性に気づいて、驚かされてしまいます。

補足をすると、この言葉は「未知に畏怖しない」と「出来ることを確実に積み重ねる」の二つの意味が少なくとも内包されていると思っています。

2. ACまでの道筋を整理する

初学者が最初に迎えるであろう壁は、初見で解く道筋が見つからない問題への取り組み方と思っています。

この現象を説明してみましょう。

基本的に、競技プログラミングのアルゴリズム部門では、以下のような手順を辿ります。

  1. 問題文を読む
  2. 構造を理解する
  3. 方針を設計する
  4. 実装する

説明として、以下を挙げます:

  • よく言われる「愚直に」とは、2と3の工程を飛ばすことを指します。これは、問題文が既に設計と同義なため、起こり得ます。
  • パターンマッチングというのは、3を飛ばして、2から4に飛躍している様です。精進の恩恵の大部分はここで受けます。

初学者が、アルゴリズムを勉強したとしても、解法にたどり着けないのは、恐らく1か2が疎かになっているためです。

訓練なしで成長は基本ありません。それぞれの工程を認識して、それに特化した練習をすれば、適切に働きかけられます。ただ、それに気づかず、簡単な問題を解いているだけでは、いくらだっても、その抜け落ちている工程に対して、取り組めるようになる日は中々来ません。

今の自分がどこにいるかを、レート帯という提出ありきで決まる粒度ではなく、細分化して評価してみることが重要です。

それぞれの項目に対して、どのような精進方法が有効かの例示とその説明は、別の記事で紹介しようと思います。

3. 慣習を踏襲する

とても重要です。

競プロは基本的に相対評価の世界です。そのため、他と同じようなことをしていても、抜き出ることは出来ないと、斜めに構えてしまうかもしれません。

その結果、一見非効率に思える精進方法(例えば、低色埋めなど)を、部分的な側面でのみ批判して、手を付けることなく、証明されていない自己流で勝負してしまいます。

論理的に考えると、初学者が訓練方法の恩恵をすべて把握できる訳もなく、また、それを通じて成長した人が、その訓練方法がどう寄与したか説明できる訳もありません。ただ、相関性があれば十分なのです。

自身の能力を過信せずに、堅実に取り組みましょう。コツコツ続けることは、達成感を得づらいため、孤独感に襲われがちです。

その時に意識してほしいことは、皆スタートラインが異なり、到達すべき方向に対して進んでいることこそが重要だということです。自分は、この、分からないことが分からない状態に耐え続ける期間に、これにとても助けられました。

4. 自分なりの環境を探し続ける

これは体調管理の延長線上にあたります。

競技プログラミングの実力へ関与している要素は、考察の精度や実装力に閉じていません。

そして、人が皆特別なように、一般的な慣習が貴方に適さないこともあります。

これは先ほどの項目と相反しているようですが、短期間で検証可能という意味合いで、共存可能です。

具体の話をすると、あまり聞かない取り組みですと、私は結果的に、以下を取り入れるようにしています。

  • 拡張機能で点数配分や問題ラベル および 提出結果を隠す
  • 数式を書く以外の用途で紙と筆記用具を封印する
  • ABCはE問題から解く
  • ツイッターとdiscordをコンテスト終わりまでアクセス制限する
  • 使用言語をC++からC#に乗り換えてタイピングの負担を軽減

別に尖れと言っている訳ではありません。ただ、少しの工夫ないし変化が、劇的な効果をもたらす可能性を放置しない方がいいという話です。

競プロへの想いと今後の展望

実利の観点では、疑問視しています。

それは、やはりAIの台頭が背景にあります。

アルゴリズムや問題解決能力といったものが、特にソフトウェア界隈において、民主化されています。

そもそも、今の世の中には未解決問題で溢れているというのに、わざわざ解法が判明している問題を作っては解いているという光景に対して、少し違和感を覚えています。教育もしくは競技としての意義は理解した上でです。

ただ、それでも、趣味として、とても好きです。

こんなに、罪悪感なく、達成感の実感を回し続けられるゲームは他にありません。

コミュニティには、同世代の同じような人がわんさかいるため、居場所を感じます。

AtCoderにおいては、今後はARCにのみrated参加しようと思っています。

本質のみ抽出するという素養に、かなりの苦手意識を覚えており、それを集中的に改善したいからです。

万が一、緑落ちしてしまったときには、出稼ぎでABC参加は免れませんが。

競プロにおいては、現在、他の競プロerさんの精進のための施策を幾つか進めています。

その内の一つは、現在の実力を可視化するwebアプリで、現在個人開発中です。技術スタックは特になく、Claude Codeに全部任せています。一緒にデザイン・アルゴリズム・運用方針を考えてくれる方を募集しています。

生活については、取り合えず研究の真似事に注力したいと思っています。結果的に、競技プログラミングでは、根拠となる数値こそ得られませんでしたが、成功体験(AC)は無数に積ませてもらえました。

将来的には、実際の社会問題に対して、同じように取り組み、ACの恩恵を、自分に留めず、周囲に還元できればと望んでいます。

ここまで読んでくださり、ありがとうございました。

12
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?