E869120's Blog

アルゴリズムや競技プログラミングに関する記事を書きます。

書籍「競技プログラミングの鉄則」を書きました

1. はじめに

こんにちは、東京大学 2 年生の米田優峻(E869120)と申します。私は競技プログラミングが趣味で、AtCoder国際情報オリンピックなどに出場しています1。また、2021 年 12 月には、初の著書となる『「アルゴリズム×数学」が基礎からしっかり身につく本』を出版しました(2 万部突破)。

さて、このたびはマイナビ出版から、2 冊目の本を出版させていただくことになりました。競技プログラミングで必要となる「アルゴリズム」や「思考テクニック」を学ぶことができる、全く新しい教科書です。

発売日は 2022/9/16 です。電子書籍版も同じ日(9 月 16 日)に出る予定です。この記事では、本書の内容と想定読者について説明させていただきます。


2. 本書の構成

本書は、競技プログラミングの全く新しい教科書です。序章「競技プログラミングとは」および終章「さらに上達するには」を除くと、10 個の章で構成されています。紙面はフルカラーであり、長さは 464 ページです。以下、各章の内容について簡単に記します。

第 1 章

第 1 章「アルゴリズムと計算量」では、競技プログラミングの問題を解くための基礎となる、アルゴリズムや計算量といったキーワードについて概観します。同時に、全 5 問の例題を通して競技プログラミングの問題形式に慣れることを目指します。

第 2~9 章

第 2~9 章では、競技プログラミングで頻出の「典型アルゴリズム」や「考察テクニック」を学びます。各章では以下のようなトピックが解説されています(節ごとの目次は後述)。

内容
第 2 章 累積和
第 3 章 二分探索
第 4 章 動的計画法
第 5 章 数学的問題
第 6 章 考察テクニック
第 7 章 ヒューリスティック
第 8 章 データ構造とクエリ処理
第 9 章 グラフアルゴリズム

第 10 章

第 10 章「総合問題」では、問題を解くためのヒントの見つけ方について概説した後、第 9 章までに学んだ知識をフル活用して実戦レベルの問題を解きます。

詳しい目次

本書の具体的な目次は下図のようになります。なお、文字が小さすぎて読めないという方は、こちらのリンク からご覧ください。


3. 本書の特徴

本書は「競技プログラミングを始めるならこれだ!」「競技プログラミングの実力アップならこれだ!」という教科書を目指しました。そのため、大きく分けて以下の 5 つの特徴を持っています。特に、わかりやすさと一定の網羅度を両立していることは、類書と比べても大きな特徴です。

特徴 1:フルカラーの図でわかりやすい!

第一の特徴は「分かりやすさ」です。本書の執筆にあたっては、フルカラーの図版を 320 点以上利用し、初学者でも理解しやすい工夫を施しました。紙面サンプルを以下に示します。(フルカラーの競技プログラミング書籍は、ほぼ初めてです)

特徴 2:演習問題で定着しやすい!

第二の特徴は「定着しやすさ」です。本書では、例題 75 問・応用問題 58 問・力試し問題 20 問、つまり計 153 問の演習問題が掲載されています。

そのうえ、すべての演習問題が自動採点システム(プログラムが合っているかどうかを自動で判定するシステム)に対応しているため、間違った理解をしていないかを確認しながら学習を進めることができます。

特徴 3:新傾向「ヒューリスティック最適化」にも対応!

第三の特徴は、最近人気のヒューリスティック系コンテスト(AtCoder Heuristic Contest など)にも対応しているということです。本書の第 7 章では、このようなコンテストで使える代表的な手法である、貪欲法・局所探索法・焼きなまし法・ビームサーチなどを解説しています。

特徴 4:競技プログラミングで必要な部分を網羅!

第四の特徴は「網羅度」です。本書では全探索から最大フロー問題まで、たくさんのトピックを扱っており、競技プログラミングで必要な部分の多くを網羅しています(詳しくは 2. の目次をご覧ください)2

しかしながら、網羅度は必ずしも難しいことを意味するとは限りません。特徴 1 にも記した通り、多くの図を使うなど、初学者にも理解できるような工夫を行っています。

特徴 5:C++PythonJAVA に対応!

本書ではページ数調整の都合上、紙面に掲載されているソースコードC++ のみとなっています。しかし、他のプログラミング言語で学習を進めたい方もいると思うので、本書のサポートページには PythonJAVAソースコードも掲載しております。


4. 本書の対象読者

本書は、「わかりやすさ」と「一定の網羅度」を兼ね備えたものを目指して作成されました。そのため、

の両方がターゲット層になっています。特に後者に関しては、AtCoder のレーティングが 0 以上 2000 未満の幅広い実力層にオススメできる内容になっています。

また、競技プログラミング参加者以外でも、アルゴリズムを本格的に学びたい方、思考力を身に付けたい方などが本書を活用することができます。たとえば、「アルゴリズム×数学」本を読んで、より深くアルゴリズムを学びたい、と思った方にはオススメです(もちろん、アルゴリズムを初めて学ぶ方にもぜひ読んでいただきたいです)。


5. おわりに

本の執筆は今回も非常にハードなものであり、時間数にして 750 時間以上を要しました。しかし、本の原稿を丹念に読み、たくさんの指摘をしてくださったり、自動採点システムの作成に協力してくださったりした 19 名の reviewer を含め、多くの方々のおかげで完成に至ることができました。本当にありがとうございます。

最後に、本書によって何か一つでも有益な知識が得られ、皆さんの人生の可能性を広げる一助となれば、筆者としては本当に嬉しいです。


6. 諸注意(競技プログラマー向け)

この本は、「競プロ典型 90 問」とほぼ無関係であることに注意してください。演習問題全 153 問のうち、典型 90 問に含まれているものは 2 問(1.3%)のみであり、大半がオリジナル問題になっています。


  1. AtCoder 赤。国際情報オリンピック(IOI)2018 金メダル相当、2019・2020 金メダル獲得。

  2. 現在出版されている競技プログラミング関連の書籍では、蟻本の次に網羅度が高いと思います。

【執筆体験記】大学 1 年生が、アルゴリズムの本を書くまで

0. はじめに

こんにちは、東京大学 1 年の米田(@e869120)と申します1。私は競技プログラミングが趣味であり、AtCoder日本情報オリンピック などに出場しています。2021 年 12 月 30 日現在、AtCoder では赤(レッドコーダー)です。

この度、「アルゴリズム×数学」が基礎からしっかり身につく本技術評論社より出版しました(既に発売されています)。アルゴリズムと数学を同時に習得できる新しい入門書です。本の内容や特徴については、

をご覧いただければと思います。

実際、一冊の本を完成させるというのは決して簡単なものではありませんでした。本記事では、本を書いたきっかけや、どのように執筆が進んだかについて記したいと思います。

目次


1. 本を書くことを決めるまで

第 1 章では、本を執筆したきっかけについて、競技プログラミング(競プロ)への参加を始めた 2015 年頃から振り返ります。

注意:この章では競プロに関する話が多く出てきますが、私が書いた本は競プロ参加者以外も対象としています。これについては 2.1 節で記しています。

1.1 競プロを始める(2015年4月~)

中学 1 年の 4 月、私は「プログラミングって何か面白そう!」と思い、単純な興味から 筑波大学附属駒場中学校 のパソコン部(通称:パ研)に入部しました。

最初はゲーム作成などをやっていましたが、同年 10 月頃に先輩から競プロを勧められ、AtCoder などのコンテストに参加し始めました。競プロで戦うために必要なアルゴリズムを学び、解ける問題の範囲を広げていくのが楽しかったため、気づいたときには完全にハマっていました。

1.2 最初の情報オリンピック(2015年12月~)

その後、2015 年 12 月に行われた中高生向けの競プロの大会「日本情報オリンピック」の予選に参加しました。当時はあまり実力が高くありませんでしたが、運よく予選を突破しました。このとき、学校の同級生などにほめられたことが大きなモチベーションになりました。

実は、私は小学校時代はいじめられており、算数などで良い成績を残しても全く認められることはありませんでした。そのため、情報オリンピックが自分にとって初めての「周りから認められた経験」となり、とても嬉しかったのを覚えています。

1.3 レッドコーダーになるまで(2016~18年)

その後は情報オリンピックの合宿で最下位に近い順位を取るなどの挫折も経験しました。しかし、毎週開催される AtCoder のコンテストに出ることで自分の苦手を分析し、その苦手を徹底的につぶしていった結果、少しずつ実力が上がっていきました。

また、中学 3 年の秋以降は練習時間も増え、学校の授業を除くすべての時間を競技プログラミングに捧げるようになりました。その結果、2018 年 3 月にレッドコーダー(上位約 0.3%)になりました。

なお、具体的な練習方法などを書くと長くなるのでここには記しません。詳しくは こちらの記事 をご覧ください。

1.4 レッドコーダーとして何かできないか?(2019年)

レッドコーダーになった後もコンテストに出場しましたが、競プロを続けていくうちに、以下のことに気づきました。

情報オリンピックAtCoder や一緒に大会に出た戦友たちから多くの刺激を受け、その結果レッドコーダーになることができたのではないか?

そこで 2019 年頃から、「自分もレッドコーダーとして、日本全体の競プロのレベルを上げることに貢献できないか?」と考え始めました。

1.5 教育的な活動(2019年~)

さて、競プロのレベルを上げる具体的な方法として、以下の 2 つがあると考えています。

  1. 競プロをやる(あるいはモチベーションを上げる)きっかけを作る。
  2. 競プロ上達のための知の高速道路を整備する。

両方がそろえば本当にレベルが上がるのではないかと思い、私は早速実行に移しました。

1. の実現に向けて

まず、2019 年 11 月に競技プログラミングのオンサイトイベント「GigaCode 2019」を開催しました。イベントではコンテストだけでなく、競プロ未経験者でも楽しめるアルゴリズムパズル という企画も行いました。

2. の実現に向けて

また、2020 年 1 月から 7 月にかけて、エンジニア向けの記事投稿サイト Qiita に競プロの解説記事を執筆しました。代表的な記事として、以下が挙げられます。

f:id:E869120:20211230114306j:plain

大学受験でいったん中断しましたが、合格後もこのような活動を続けました。「今の日本の競プロに足りないものは何なのか」を強く意識するようになり、2021 年 4~7 月にかけて以下の 2 つの教材を作成しました。

足りないと思ったもの 作ったコンテンツ
競プロの典型問題集 競プロ典型 90 問
競プロに必要な数学をまとめた記事 Qiita|アルゴリズム・AtCoder のための数学

1.6 本の執筆依頼が来る(2021年4月)

今年 4/16 に技術評論社から「アルゴリズムと数学の本を書きませんか?」というメールが届きました。こんなに早く本を書くことになるとは思っていなかったので正直驚きましたが、人生で一度きりしかないチャンスかもしれないと思い、執筆を決めました。

f:id:E869120:20211230120451j:plain
突然送られてきたメール(掲載許可は取っています)


2. 本が完成するまで ~執筆体験記~

私は 2021 年の夏から秋にかけて 1 冊の本を執筆しましたが、決して簡単なものではありませんでした。「どうすれば分かりやすくなるのか」「どうすれば伝わりやすくなるのか」という迷いと葛藤の連続であり、完成させるのに 850 時間以上を要しました。

そこで第 2 章では、本が完成するまでの流れを時系列順に振り返りたいと思います。通常の執筆スタイルとは異なる方法をとった部分もありますので、ぜひ引き続きお読みください。

2.1 企画と対策(2021年4~5月)

実は、執筆依頼を受けた時点では競プロ参加者のみを対象にすることを検討していました。しかし類書を 15 冊くらい調べたところ、アルゴリズムの入門書はたくさんあるにもかかわらず、アルゴリズムと数学を同時に解説した本は非常に少ないことが分かったので、「競プロ参加者以外にも役立つのではないか?」と思いました。そして編集者の方と相談を重ね、単なる競プロ対策本に終わらないよう、幅広い層に手に取ってもらえるようなアルゴリズムと数学の本を執筆することに決めました。

一方、良い本を書くためには相応の執筆スキル(または文章力)が必要です。私はまだ大学 1 年生であり、Qiita に書いた記事も 20 本程度とそこまで多くなかったため、「経験が浅すぎて正直やばいのではないか」という危機感がありました。

そのため、勇気を出して 10 人程度に Twitter の DM を送り、自分が過去に投稿した記事の問題点や改善点を指摘していただくように頼みました。幸運なことに多くの人に答えていただき、中には 7 ページの PDF を書いてくださった方もいました。執筆の際に大変参考になりました。

2.2 執筆の流れについて

その後、5/17 に本の企画が正式に通りましたが、進行中の企画「競プロ典型 90 問2」を完成させてからの方が良いと思ったので、執筆開始は 8 月となりました。

幅広い層に楽しんでいただける本を目指すため、大学教員から数学を勉強中の人3まで、中学生から社会人まで、様々な層を含む 12 名の方々にレビューを依頼することにしました。この判断が後になって、本書の正確さや分かりやすさの向上に大きく寄与したのではないかと考えています。

また、執筆は下図のようなフローで進めました。通常は初校が完成した段階でレビューを受けるのですが、私は「前半の章で指摘された点を、後半の章の執筆に活かせるのではないか」と考えていました。そのため、5~10 ページ単位で「迷った部分の質問」を slack に載せ、それに対する意見や読みづらかった点などを書いてもらう形式にしました。

f:id:E869120:20211230150632j:plain

2.3 執筆 1 巡目(2021年8~9月)

東京大学では 8 月の第 1 週に期末試験が終わり夏休みに入るため、1 日 15 時間程度を執筆に使っていました。毎朝 9 時に起き、夜中の 2~3 時まで集中して本を書くような生活でした。

しかし、書籍執筆は初めてであったほか、一体どうすれば分かりやすくなるのか、一体どうすれば簡潔に書けるのかということを強く意識したため、予想以上に時間がかかりました。

「ある説明方法を選ぶと〇〇の読者層には伝わるが、△△の読者層には伝わりづらくなるからどうしよう」「こう説明すれば分かりやすいが非常に長くなってしまうからどうしよう」という葛藤も決して少なくなく、一つの図を作るのに 2 時間以上を要したこともありました(注:図は本全体で 280 個ほどあります)。

そのため、レビューを受けながら初稿が一通り完成したのが 9/27 であり、その頃には夏休みがほぼ終わっていました。

f:id:E869120:20211230152958j:plain
執筆中の slack の様子(意見は #review チャンネルに書いていただく)

2.4 執筆 2 巡目(2021年10月)

初稿が一通り完成した後は、自分の書いた文章をもう一度読んで「分かりづらい」と思った箇所を直しました。数学が苦手な reviewer から「理解できなかった」というコメントをいただいた部分も、この段階で修正しました。

また、レビューの中には「この原稿には〇〇という内容が含まれていないが、アルゴリズム学習では重要だから入れた方が良い」というものもあったので、ページ数に収まる範囲で新たな章や節を追加しました。4

分かりやすさを増大させるために説明や図を 3~4 回変えた箇所もあったため、思ったより時間がかかり、2 巡目が終わったのが 10/23 でした。しかし、最終的にはすべての reviewer に全体の 9 割以上の内容を理解してもらうことに成功しました。

f:id:E869120:20211230153931j:plain
執筆 2 巡目の様子(掲載許可は取っています)

2.5 校正作業(2021年11月)

原稿を編集者に提出してから組版ができあがるまでに 2 週間程度かかるため、この期間はたまった大学の課題などを片付けていました。その後、11/4 に校正作業が始まりました。

一切の妥協をしたくないと思い、原稿を最初から最後まで読む作業を合計 7 回行ったため、組版ミスなどを含めて 2000 個以上の修正点が見つかりました。

締切が近づく中、学業とも両立する必要があったため、睡眠時間が 4 時間(通常の半分)を下回った日もありましたが、12/3 に何とか校了することができました。おそらくこの時期が一番忙しかったと思います。

2.6 解説作成(2021年12月)

この本には 140 問を超える演習問題がありますが5、ページ数の都合上解説は GitHub ページ に掲載することになったため、12 月は出版プロモーションをやりながらこれを作成していました。作業量が多く、発売日(12/25)には間に合いませんでしたが、12/29 に完成しました。6


3. 書籍執筆を通して得たもの

4 カ月間の書籍執筆では非常に多くのことを学びましたが、その中で一つ選ぶとすれば、執筆スキルや文章力の向上です。

私はこれまで Qiita などに記事を投稿してきましたが、一つの記事に掛けた時間は高々数十時間程度でした。しかし今回は、

本を出版するからには、大学 1 年生であることに甘えてはならない。専門家が書いた本と同じ土俵で戦わなければならない。

と思い、編集者や 12 名の reviewer から多数の意見をいただきました。また、自分自身でも「どうすれば初学者にも伝わるのか」ということを休みなく考えて原稿を書きました。

こんな経験は初めてであったため、当然ハードなものとなりましたが、ここで得たスキルは今後の活動だけでなく、論文執筆や研究発表などにも役立つのではないかと思っています。とても良い経験ができました。


4. おわりに

計 850 時間にわたる書籍の執筆はとても大変な作業でしたが、妥協がなく満足のいく本を仕上げるにあたって、reviewer を含む多くの方々にお世話になりました。本当にありがとうございます。また、大学 1 年生の私が本を書く機会に恵まれたことに感謝しています。

最後に、アルゴリズムと数学に興味のある方は、ぜひ本を手に取っていただければと思います。また、本を通して何か一つでも有益な知識を得られたならば、私としては本当に嬉しいです。


  1. E869120 は東大の学籍番号ではありません。

  2. 競プロの典型問題を 1 日 1 問投稿する企画です。2021/3/30 ~ 2021/7/11 の期間に行われました。

  3. 中学数学を勉強中の社会人の方もいました。

  4. たとえばソートは元々 2 ページのコラムにする予定だったのですが、reviewer の意見を受け、13 ページかけて丁寧に解説することにしました。

  5. 節末問題・最終確認問題だけで全 148 問。例題を合わせると全 200 問。

  6. その他にも、自分の書いたプログラムが正しいかどうかを自動で判定する「自動採点システム」の準備をする必要がありましたが、これに関しては reviewer のうち希望者 7 名に手伝っていただきました。ありがとうございます。

アルゴリズムと数学の本を書きました

1. はじめに

こんにちは、はじめまして。東京大学 1 年生の米田優峻(E869120)と申します。私は競技プログラミングが趣味で、AtCoder国際情報オリンピックなどの大会に出場しています1。2021 年 11 月時点で、AtCoder では赤色(レッドコーダー)です。また、2020 年以降、アルゴリズムを学べる以下のようなコンテンツや資料を作成してきました。

さて、このたびは技術評論社から、書籍を出版させていただくことになりました2アルゴリズムと数学が同時に学べる新しい入門書です。

発売日は今年のクリスマス、2021/12/25 です。電子書籍版も同時期に出る予定です。本記事では、この本の内容と想定読者について、簡単に紹介させていただきます。

f:id:E869120:20211202192831j:plain


2. 本書の特徴

Amazon の商品ページにも書かれていますが、本書には以下の 5 つの大きな特徴があります。

  1. 本書は有名なアルゴリズムの紹介に終始せず、それに関連する数学的知識、そしてアルゴリズム効率化に応用可能な数学的考察も解説している。
  2. 手計算問題・プログラミング問題合わせて全 200 問の例題・演習問題が掲載されており、知識がしっかり身につきやすい。
  3. プログラミング問題の 8 割以上について、自分のプログラムが正しいかどうかを自動で採点するシステムが提供されており、演習が進めやすい。
  4. 多数の図(計 250 個以上)を用いるなどして、初学者でも読みやすい工夫を施している。
  5. C++PythonJAVA/C のソースコードを用いて解説している。

特に 1. については、アルゴリズムに関する書籍のほとんどが高校数学の履修を前提としているか、多くのアルゴリズムを表面的になぞるにすぎないかのいずれかであることから、本書最大の特徴であると考えています。

なお、5. についてはページ数を抑えるため、紙面に掲載されているソースコードC++ のみになっています。しかし、本書に対応している GitHub ページには 4 つの言語すべての解答例が掲載される予定です。


3. 本書の構成について

本書は以下の通り全 5 章(+ 最終確認問題)から構成されます。長さは 約 280 ページ です。

f:id:E869120:20211202193901j:plain

以下、それぞれの章の内容について、簡単に記します。

第 1 章・第 2 章

まず、第 1 章ではアルゴリズムとは何かを解説し、アルゴリズムと数学の関係について簡単に記します。第 2 章では、アルゴリズムを学ぶために必要となる、文字式・2 進法・指数関数・対数関数・ランダウの O 記法をはじめとする数学の前提知識を解説します。

第 3 章・第 4 章

第 3 章・第 4 章では、二分探索・ソート・モンテカルロ法動的計画法深さ優先探索幅優先探索ユークリッドの互除法・エラトステネスのふるい・ニュートン法などの有名なアルゴリズムを扱います。また、関連する数学の知識は、必要になったときに図を用いて解説します。扱うアルゴリズムと数学的知識については、「本書で扱うコンテンツ」をご覧ください。

第 5 章

第 5 章では、アルゴリズムの問題における典型的な考察パターンを紹介します。数学的考察といえば競技プログラミングを思い浮かべる人がいるかもしれませんが、本書では競技プログラミング参加者以外にも知っていただきたいものを 10 個程度のポイントに分けて整理します。多くの読者にとって、最もたのしい章でしょう。

最終確認問題

最後に、全 30 問の最終確認問題で、本書で扱った内容を振り返ります。

本書で扱うコンテンツ

本書で扱うアルゴリズム・数学的知識・数学的考察は次の通りです。数学的知識に関しては、中学レベル~大学教養レベルの範囲の中から、アルゴリズムに必要なところだけに絞って解説されています。(280 ページに分かりやすくまとめるため、データ構造はあまり多く扱っていません)

f:id:E869120:20211202192707j:plain


4. 本書の対象読者

数学が苦手な人も、そうでない人も利用できるものを目指して本書を作成しました。たとえば、以下のようなターゲット層を想定しています(もちろん、これだけではありません)。

  • まだ数学を一通り修了していない中高生の方
  • 数学に苦手意識があるけれど、この機に数学とアルゴリズムを学び、プログラミングなどに応用できるようにしたい方
  • 数学は苦手ではないが、これまでに学んだ数学の知識と関連付け、応用可能な形でアルゴリズムを理解したい方
  • 競技プログラミングの実力を上げたい方


5. 競プロ参加者向け補足

本書の難易度を類書と比べると、以下のようなイメージだと考えています。しかしながら、本書はほかのアルゴリズム本とは異なり、数学的な事柄についても記されているため、人によって意見が分かれると思います。

アルゴリズム図鑑 << チーター本 << 本書 < PAST 本 < 螺旋本 <= けんちょん本 < 典型 90 問 << 蟻本

また、競プロ典型 90 問その書籍版(2022 年 5~6 月頃出版予定) の方が難易度や網羅度が高いです3。本書で基礎的な数学的知識とアルゴリズムの知識を得てから、典型 90 問に挑戦するのもアリです。

6. おわりに

本の執筆はとても大変な試みであり、時間数にして約 800 時間をかけることになりました4。しかし、本の原稿を丹念に読み、たくさんの指摘をくださった 10 名以上の reviewer を含め、とても多くの方々にお世話になりました。本当にありがとうございます。

また、私は「日本情報オリンピック」という大会をきっかけにアルゴリズムを本格的に学び始め、プログラミングコンテストサイト「AtCoder」に参加することで自身のスキルに磨きをかけることで、最終的に本を書けるレベルまで至りました。このような環境には感謝しております。そして、これまでの私の活動を支えてくださった競プロコミュニティには大変感謝しております。

最後に、本書を通して、何か一つでも有益な知識を得られれば、筆者としては本当に嬉しいです。


  1. 国際情報オリンピック(IOI)2018 金メダル相当、2019 金メダル、2020 金メダル獲得。

  2. 私にとって初めての出版となります。

  3. 典型 90 問書籍版では、高度なデータ構造やマラソン型課題も扱う予定です。

  4. 執筆を本格的に始めたのが 8 月中旬であり、4 カ月弱の期間、学業と両立させながら 1 日平均 8 時間ほどを費やしました。