🦁

競プロの解説記事を書いてみようというお話

2021/12/13に公開

はじめに

この記事は 競技プログラミングを始めたばかりの人に伝えたいこと Advent Calendar 2021 の 14 日目の記事です。

https://qiita.com/advent-calendar/2021/pre-competitive

こんにちは、みなさんは競技プログラミングをやっていますか。
この記事をお開きになっているということは、きっと競技プログラミングをされていることでしょう(横暴ですね...)。

それでは少し趣旨を変えて。
みなさんは競技プログラミングの解説記事を書いたことはありますか。
このような主題にすると、少し相対数は減ってしまうのかなと思います。


この記事は、競技プログラミングの解説記事をまだ書いたことがない方に向けて、ぜひお手軽な気持ちで解説記事を書いてみませんか をお届けするものです。

自己紹介

私は ganyariya といいます。
最近は競技プログラミングをあんまりやっておらず、開発が楽しくてそちらに多くの時間を割いています。(研究が終わればもっと時間ができるはず...)

https://github.com/ganyariya/ganyariya

ganyariya は Scrapbox というサイトに簡単な解説記事を書いてまとめています。
具体的には、今のところ 1900 ぐらい解説をまとめています。
またいくつかのアルゴリズムについては、 Qiita で解説記事を書いています。


https://scrapbox.io/ganariya-competitive/
https://qiita.com/search?sort=&q=user%3Aganyariya+tag%3A競技プログラミング

競プロの解説記事

そもそも競プロの解説には、大きく分けて公式解説とユーザ解説の 2 種類があります。
今回の趣旨は、後者のユーザ解説をお手軽に書いてみようというものです。

公式解説

多くのコンテストサイトでは、コンテスト終了と同時に解説が公開されます。
たとえば、 AtCoder では公式解説が 2 種類用意されています。
rng_58 さんや snuke さんによる動画解説、そして Writer の方々の公式解説があります。

https://atcoder.jp/contests/abc230/editorial

ユーザ解説

一方、ユーザ解説は、以下のようなサイトに有志の方が書いている記事を指します。

  • はてなブログ
  • Qiita
  • Zenn
  • Scrapbox(おすすめ)

ユーザ解説をされている有名な方々としては drken さんや ARMERIA さんがいます。

drken さんはアイディアやテクニックをまとめて多くの問題を解説しています。
https://drken1215.hatenablog.com/

ARMERIA さんは解説が丁寧で、とくにアイディアや発想を分かりやすく説明する画像が特徴的です。
https://betrue12.hateblo.jp/

また、難易度の高い問題が多いですが、 kmjp さんや hamayanhamayan さんがコンスタントに解説記事を書かれています。

https://kmjp.hatenablog.jp/
https://blog.hamayanhamayan.com/

解説記事を書くメリット

解説記事を書いている方々はどうして解説記事を書いているのでしょうか(哲学)。
それは以下のようなメリットがあるからだと ganyariya は考えます。

理解が深まる・知識が定着する

コンテスト中に問題が解けるととても嬉しいです。
しかし、問題を解くのがコンテスト中だけだと、問題に対して考えたアプローチや向かい方が忘れ去られてしまいます。
また、コードを書いて提出するだけだとアイディアを言語化できません。(コードの時点で言語化しているともいえますが...)

一方で解説記事を書くと、書いている中で理解が深まり、知識が定着化します。
問題が与えられたときにどう問題を小さく切り分けるのか、視点を変えるのか、など自分がどう競プロの問題に向き合っているかが分かります。

知識やアイディアを抽象化できる

競プロの記事を書いていると、別々の問題に対する知識やアイディアが結合され、抽象化されるときがあります

例えば、ダイクストラの問題の解説記事を書きその後動的計画法の記事を書くと、ダイクストラもたかだか DP なんだなということに気づきます。
また、二分探索の問題の解説を多く書くとなんとなく二分探索が使える問題の条件が分かってきます。(例えば、最大化の最小化など。)

このような知識とアイディアの抽象化は、新しい問題へ出会ったときに対するアプローチの発想を手助けしてくれます。
あのアイディアや考え方が使えるかも? と一歩引いた視点で問題を捉えられます。

このような抽象化は drken さんの記事のタグを見ると参考になるかと思います。

https://drken1215.hatenablog.com/

いろんな方に読んでもらえる

解説記事を書くと多くの方に読んでもらえます。
とくに、読んだ方々とお会いしたときに 解説記事読みました〜 と言われると非常にうれしい気持ちになります。

書いた解説記事の数が増える

競技プログラミングをやっている方々のうち、レートを上げるのが楽しい というのがモチベーションになっている人もいると思います。
自分もこれにかなり近い理由で競技プログラミングをやっていました。

そのような方々にとっては、解説記事が増えていくのがとても充実感あるものだと思います。

レートが上がる

なによりレートが上がります。
ganyariya は解説記事を書いていたから青色になれたのだと思います。(今は精進する時間がなく水色に落ちてしまいましたが...)

解説記事をまとめていなかったらおそらくどこかの色で停滞していたかなと思います。

解説記事を書くにあたって

これらのメリットを踏まえると、どうやら解説記事を書いたほうがいいようです(悪い大人)。
ここからは解説記事を書くにあたって、意識すると良いかもしれないことを順不同に書いていきます。

サイトについて

解説記事を書くサイトについてですが、個人的には 個人サイト はてなブログ Scrapbox などがいいのかなと考えています。
基本的に個人がもつサイトであるため、お手軽に解説記事を書いても許されるためです。

Scrapbox

個人的には Scrapbox がおすすめです。
記事内に タグ を書くことができ、このタグはそれぞれの記事を関連付けます。
記事がノード、タグが辺となっているような無向グラフと考えてもらうとわかりやすいかなと思います。

https://scrapbox.io/ganariya-competitive/

他サイトと比べて検索しやすい特徴もあります。
そのため、コンテスト中に セグメント木素因数列挙 などを自分の Scrapbox Project で調べて参考にすることが多くあります。

また、タグ を書くことが即時に知識の抽象化にも繋がります。
そして、問題ごとにページを作ると右下のページ数が増えていくため幸せな気持ちになります。

お手軽さについて

記事を書くときはお手軽な気持ちで えいやっ と書くと良いです。
お手軽な状態にしておけばかなり継続しやすい状態になります。

たとえば、コンテストごとに 1 つの記事を書く だと、すべての問題の解説を書かないと世に出すことはできません。
だんだんと腰が重くなり、結局続かなくなってしまいます。

一方、問題ごとに 1 つの記事を書く だと、気分によって自分が好きな問題や解けなかった問題だけに注力できます。
またページ数も増加するため、モチベーションも増加します。
解説が続いている方々の多くは、自分の観測上ではこちらの形式が多いのかなと感じています。

最後に

この記事を読んで競技プログラミングの解説記事を書く人が 1 人でも増えるとうれしいなと思います。

もし書き始めた方がいらっしゃったら Twitter などで教えてもらえると嬉しいです、見に行きます!

来年から働き始めたら Windows の機材を買って VTuber になり、競プロの布教活動をしたいですね...

GitHubで編集を提案

Discussion