第23回日本情報オリンピック (JOI 2023/2024) 本選概要

2023年12月15日
情報オリンピック日本委員会

更新履歴

  • 2024.1.13 講演会の講義題目と概要を掲出しました.
    本選競技規則を更新しました.本選競技で使用できるプログラミング言語は「C++ (C++ のバージョンは C++20)」です.
  • 2023.12.15 このページを掲出しました. JOI 2023/2024 本選はオンラインで開催されます.
    このページは随時更新しますので, 参加者はときどき参照するようにしてください.
    《注意》 いかなる目的であっても, 参加者が競技中に生成 AI (ChatGPT 等) を使用することは禁止されています.

JOI 本選実施スケジュール

JOI 2023/2024 本選はオンラインで開催します. 自宅または学校の部室などから参加してください.
インターネット接続環境および開発環境は各自で用意してください.

1月28日(日)
14:00~15:00 ガイダンス・開会式
15:00~16:00 講演会
  講師 丸茂直貴 先生(東京大学 大学院情報理工学系研究科 数理情報学専攻(特任助教))
     東京大学大学院情報理工学系研究科博士課程修了.博士(情報理工学)
     NTTコミュニケーション科学基礎研究所研究員を経て現職
  講演題目 連続最適化入門
  概要 最短路問題やナップサック問題など離散最適化問題(組合せ最適化問題)は,情報オリンピックでもしばしば出題されるため,みなさんお馴染みでしょう.一方で現実世界の意思決定では,決定すべき変数が連続的な値をとる連続最適化問題も現れます.本講演では,連続最適化について,特にアルゴリズムの計算量の観点から,事前知識を前提とせずに解説します.最近の私の研究も含め,連続最適化研究の最先端についても簡単に紹介する予定です.
16:00~18:00 プラクティス(実機練習)
18:30~21:00 オンライン交流会
2月4日(日)
13:00~17:00 本選競技
17:30~19:00 問題解説 

  • 1月28日(日)のプラクティスは, 競技環境 (コンテストシステムの利用方法など) に慣れることを目的にしています.
  • 1月28日(日)の参加は義務ではなく, プラクティスに参加しなくても失格にはなりませんが, プラクティス不参加による不利益は一切考慮しません.
  • 2024 年 2 月 4 日 (日) 19:00 ~ 2 月 5 日 (月) 19:00 (日本時間) に本選競技と同じ課題を使ったオープンコンテストを開催する予定です. この時間から自由に連続する 4 時間を選んで参加することが出来ます. 詳細はオープンコンテストについてをご覧ください.

JOI 本選参加申込方法

JOI 本選に進出した有資格者が JOI 本選に参加するには, 受付システムのマイページより競技者本人による JOI 本選参加申込手続きが必要です.
詳細は本選実施要領・本選でお知らせします.

情報オリンピック日本委員会への連絡

  • 本選参加者との連絡は, 基本的に, 本選参加者を対象とした Discord サーバを通じて行います (競技実施中を除く).
  • Discord サーバへの接続方法は2024年1月中旬までに本選参加者に連絡します.
  • 競技実施中の連絡は, コンテストシステムの「質問 (Questions) 」欄から送ってください.

本選競技内容

  • 本選競技では, アルゴリズムを設計し, そのアルゴリズムを C++ で実装する課題が出題されます.
  • どの課題にも実行時の実行時間と使用メモリに制限があります. 課題によってはアルゴリズムの効率が重要となります. 採点用入力データは, 効率が異なる解法を識別できるよう調整されています. どの課題にも, ある程度の効率であって, 正当な解を出力する解法であれば, その課題の制限の中で正解を出力できるような採点用入力データがいくつか用意されています. ですから, 競技参加者が全ての採点用入力データに対して制限内で正解を出力する解法を得られなかった場合でも, 課題に取り組む意味はあります.
  • 過去の情報オリンピックで出題された問題と解説を参考にしてください.

本選競技規則

競技時間 4 時間
課題数 5 題
配点 配点は各課題 100 点で, 満点は 500 点となる.
各課題は 1 つまたは複数の小課題からなる. 小課題の配点は問題文中に記載する.
使用できるプログラミング言語 C++ (C++ のバージョンは C++20)

本選競技システムで使われるコンパイルオプション
【g++ (C++)】 -DEVAL -std=gnu++20 -march=native -O2 -pipe -static -s-o 2024-ho-t? 2024-ho-t?.cpp
コンパイルオプションは競技システムからも確認できる.
使用できる用品 筆記用具および計算用紙を使用できる. 筆記用具と計算用紙は各自で用意すること.
競技参加者は, 競技中に小さなマスコットを机の上に置くことができる. 小さなマスコットを身につけて競技に参加することもできる.
使用できる機器・ソフトウェア 参加者が競技中に生成 AI (ChatGPT 等) を使用することは禁止されている.
生成 AI を除き, 本選競技に使用可能な機器・ソフトウェアに制限は無い. 競技規則の他の禁止事項に抵触しないのであれば,オンライン・オフラインを問わず,生成 AI を除くあらゆるソフトウェアやウェブサービスを利用することができる.
競技参加に必要な機器・ソフトウェアは各自で用意すること.
もしウェブサービスを利用してソースコードの作成や検証をする場合は, 作成したソースコードが競技時間中に第三者の目に触れることのないように十分注意すること.
各自の用意した機器・ソフトウェアで本選競技に問題無く参加できることをプラクティスの時間に確認すること.
解答方法・解答提出方法 本選競技は CMS (Contest Management System) を用いて実施する.
課題の趣旨に合致するプログラムを作成し, 解答提出用 Web インタフェースからソースを提出すること. 解答プログラムは, 入力を標準入力から読み込み, 出力を標準出力に出力し, 正常終了すること(0 を返すこと).
提出した解答にはフィードバックが与えられる.
各課題ごとに, 最後の提出から 1 分間は解答を提出することができない.
各課題ごとに, ソースを提出することができる回数は 50 回までである.

【ジャッジシステムの仕様について】 CMS でテスト機能が使用できる. ソースコードと入力ファイルをアップロードすることで,ジャッジサーバー上での実行結果を得られる.
フィードバック 競技中に提出されたソースは「使用できるプログラミング言語」に記載のコンパイルオプションを用いてコンパイルされ, 問題文中の例と, 全ての採点用入力データに対して実行される. その結果がフィードバックとして競技参加者に通知される. 競技参加者は, フィードバックを利用することで, 自分の提出したソースが問題文の仕様をみたしているかどうかを確認することができる. また, その課題に関する自分の得点を競技中に知ることができる.
フィードバックの詳細については, プラクティスの時間に確認すること.
フィードバックが与えられるまでに時間がかかることがある. 競技終了 15 分前までに提出されたソースには競技時間内にフィードバックが与えられる. それ以降に提出されたソースには競技時間内にフィードバックが与えられるとは限らない.
採点方法 予選同様, 採点用入力データに対する出力の正誤で得点を定める.
ただし, 実行時の実行時間と使用メモリに制限がある. 制限の詳細は競技システムの問題ごとのページから確認できる.
採点プログラムは解答プログラムをコンパイルし, 採点用入力データに対して実行する. 時間・メモリの制限を満たして正常終了し, かつ, 出力が正しい場合に, その採点用入力データへの出力は正解となる.
各課題は 1 つまたは複数の小課題からなる. 小課題に関する詳細は問題文中に記載する.
各小課題に対し, いくつかの採点用入力データをセットにして採点を行う. セット内の全ての採点用入力データに正解した場合に限り, その小課題分の得点が与えられる.
ソースを複数回提出した場合は, 提出された全てのソースが採点される. 各小課題に対し, 提出された全てのソースにおけるその小課題の得点の最大値が, その小課題の最終的な得点となる.
各課題の得点は, その課題に含まれる小課題の最終的な得点の合計である.
質問 競技参加者は, 質問がある場合はコンテストシステムの「質問 (Questions) 」欄から質問を提出することができる.
競技開始から 2 時間経過するまでに提出された質問には競技中に回答する. 競技開始から 2 時間経過後も質問を提出することはできるが, 競技時間内に回答するとは限らない.
競技中の質問方法および質問への回答の確認方法は, プラクティスの時間に確認することを勧める.
質問は日本語で行うこと.
資料の参照・インターネットの利用
  • 競技参加者は, 競技中に参考書・ノート・辞書などの資料を参照することができる.
  • 競技参加者は, あらかじめ自分の PC 上に作成しておいたプログラムや文書を利用して競技に参加することができる.
  • 競技参加者は, 競技中にインターネット上で公開されている情報を検索して競技に利用することができる.
  • ただし,生成 AI (ChatGPT等) を使用することや, SNS や質問サイトなどを用いて第三者の助けを借りることは, 以下の禁止事項に抵触するので, 許されない.
禁止事項
  • 競技参加者は, いかなる目的であっても, 競技中に生成 AI (ChatGPT 等) を使用してはならない.
  • 競技参加者は, いかなる内容であっても, 競技実施中に Twitter や Facebook などの SNS を用いて情報発信を行ってはならない.
  • 競技参加者は, いかなる方法・内容であっても, 競技実施中に第三者の助けを借りてはならない.
  • 競技参加者が, メール, チャット, Twitter, LINE やその他の方法で競技実施中に第三者と連絡を取ることは禁止されている (情報オリンピック日本委員会との連絡を除く).
  • 競技参加者が提出する解答プログラムは, 実行時に標準入出力以外にアクセスしてはならない. 一時ファイルの作成, ネットワークへのアクセス, 外部プログラムの呼び出しは禁止されている.
  • CMS において, 自分自身に割り当てられたアカウントを使用すること. 自分自身に割り当てられたアカウント以外のアカウントへのアクセス権を得ようと試みてはならない.
アピール(異議) 競技時間終了後に採点用入出力データを配布する.
参加者は採点用入出力データを用いて自分の提出したプログラムの動作確認を行うことができる.
競技結果についてアピール(異議)がある場合は, 定められたアピール期間内であれば, アピールを提出することができる. 提出されたアピールに基づき採点をやり直すことがある. 採点をやり直した結果, 参加者の得点は上がることもあれば下がることもある. アピール後の得点が最終的な得点となる.
アピール期間終了後に競技結果が確定する. アピール期間終了後のアピールは認められない.
アピール期間およびアピール提出方法は競技参加者に別途連絡する.
注意事項 C++ の入出力について
大量の入出力データを扱う課題を解く際に, 入出力の処理に cin / cout ストリームを使用した C++ プログラムは scanf / printf 関数を使用した同等のプログラムに比べて遅くなることがある. 入出力データが多い課題では, cin / cout ストリームを使用して実行時間を超過する場合に, scanf / printf を使用することで入出力を高速化できることがある.

スタック制限について
特に指定のない限り, 競技システムで実行される際のスタックのサイズに制限はない. ただし, 使用されるスタックは, そのプログラムが使用するメモリの一部として扱われるので, 各課題のメモリ制限を超えることはできない. 手元の環境で再帰処理を行うときはスタックオーバーフローに注意すること. 各課題のメモリ制限は CMS で確認できる.
その他 本選競技課題および採点用入出力データは, 後日, 情報オリンピック日本委員会のウェブページで公開する.

本選FAQ

よくある質問とその回答です. 実際にあった質問については, 表現を変更している箇所もあります. 今後, 皆さんから質問がありましたら, その質問と回答を追加していきます.


Q1: どうして生成 AI (ChatGPT等) の使用が禁止されているのですか?
A1: 日本情報オリンピック本選では問題内容を理解し, 効率の良いアルゴリズムを設計して, 設計したアルゴリズムを C++ で実装する能力を競う競技です. 生成 AI (ChatGPT 等) の使用を許可すると本選競技の対象としている能力を測ることができないため禁止しています.
Q2: 自分が Python で書いたソースコードを C++ に変換するために ChatGPT を利用することはできますか.
A2: できません.いかなる目的であっても, 参加者が競技中に生成 AI (ChatGPT 等) を使用することは禁止されています.
Q3: どうして JOI 本選では参考資料の閲覧や競技時間中のインターネット検索が許されているのですか?
A3: 過去に会場で開催されていたときの JOI 本選では, 参考資料の閲覧や競技時間中のインターネット検索は禁止されており, 競技監督が不正行為をチェックしていました. しかし, 競技監督のいないオンライン競技ではそのようなことはできませんので, 本年度の JOI 本選では参考資料の閲覧および競技時間中のインターネット検索を許可することにしました.
Q4: どうして JOI 本選では Python が使用できないのですか?
A4: JOI 本選で Python が使用できない理由は, 主に 2 つあります.
1 つ目は, Python は C++ に比べて実行速度がとても遅く, 実行時間でアルゴリズムの優劣を測る競技では不利になってしまうことです. JOI 本選のような難易度の高い問題が出題される競技では, C++ で満点が取れるアルゴリズムであっても Python ではほとんど点数が付かないということも起こりえます. JOI 本選で Python を使用可能とすると, 競技の公平性を保つことが難しくなってしまうと考えられます.
2 つ目は, JOI がプログラミングを広げる大会であると同時に, 国際情報オリンピック (IOI) 日本代表選手を選抜する大会でもあることです. 日本国内では入門用プログラミング言語として Python が広く親しまれていますが, IOI で使用可能なプログラミング言語は現在のところ C++ のみです. そのため, 日本情報オリンピックでは, 一次予選では Python であっても模範解答として想定されている解答であれば満点が取れるように競技課題を設計していますが, 二次予選以降では IOI にあわせていくよう段階的に競技規則を定めています. そのため JOI 2023/2024 本選および春季トレーニングでは, 使用可能なプログラミング言語は C++ のみとなっています.
Q5: あらかじめスクリプトファイルや C++ のソースコードなどのファイルを作成しておき, 競技中にそれらを使用することはできますか?
A5: 可能です.
Q6: 競技中にインターネット検索でソースコードを入手して, 競技中にそれらを使用することはできますか?
A6: 可能です.
Q7: 競技中に PC にあらかじめインストールされている man や info などのドキュメントを参照してよろしいでしょうか?
A7: 可能です. man や info だけでなく, 参加者は, あらかじめ用意した参考書・ノート・辞書などの資料を参照して競技に参加することも可能です. また, インターネット上で公開されているオンラインドキュメントや資料を検索・参照して競技に利用することができます.
ただし, 資料の参照の代わりに生成 AI (ChatGPT等) を使用してはなりません. ソースコードの生成を目的としない場合であっても, 競技時間中の生成 AI (ChatGPT等) の使用は禁止されています.
Q8: 言語規定に関してですが, 定められた方法でコンパイルが可能なら, 実装方法などは問わないということでよろしいでしょうか?移植性の無いプログラムを書いても構いませんか?インラインアセンブリを使ってもよいでしょうか?
A8: 競技に使用するコンパイラのサポートしている機能であれば自由に用いることができます. ただし, コンパイラのバージョンやコンパイルオプションに注意してください. 本選競技システムについての詳細は, プラクティスの時間に確認してください.
Q9: 本選競技中, 開発を補助するプログラムやスクリプトを適宜作成実行しても構いませんか?
A9: はい.
Q10: 電卓の使用は可能でしょうか?
A10: 可能です. 電卓だけでなく, 参加者があらかじめ用意した機器を自由に利用することができます.
Q11: 問題文を印刷して競技に参加することは可能でしょうか?
A11: 可能です. 問題文はコンテストシステムより PDF ファイルで配布します. 競技参加者は, もし必要であれば, PDF ファイルを印刷して競技に参加することも可能です.
Q12: 競技用 PC に自分の使い慣れているアプリケーションをインストールして, 本選競技で使用することはできますか?
A12: 可能です. 本年度の本選競技では利用可能アプリケーションに制限はありません.
Q13: 小さなマスコットを PC の横に置いたり, 身につけて本選競技に参加してもよろしいでしょうか.
A13: はい. 小さなマスコットを PC の横に設置して本選競技に参加することができます. また, 小さなマスコットを身につけて本選競技に参加することもできます.
Q14: 本選競技環境におけるコンパイル方法・コンパイルオプションは何でしょうか.
A14: 本選競技で使用できるプログラミング言語は「C++ (C++ のバージョンは C++20)」です. コンパイルオプションは競技システムからも確認できます. 本選競技システムにおけるコンパイルオプションを, 競技中に競技参加者が変更することはできません.
本選競技では以下のコンパイルオプションを使用する予定です. これらのコンパイルオプションは変更されることがあります. 変更されましたら本ウェブページでお知らせします.

【g++ (C++)】 -DEVAL -std=gnu++20 -march=native -O2 -pipe -static -s -o 2024-ho-t? 2024-ho-t?.cpp
コンパイル方法(例)
$ g++ -DEVAL -std=gnu++20 -march=native -O2 -pipe -static -s -o 2024-ho-t1 2024-ho-t1.cpp

コンパイルオプションについての補足
-DEVAL
マクロ名 EVAL を 1 と定めるコンパイルオプション. ソースの先頭に #define EVAL 1 と記述することと同等の意味を持つ. マクロ名 EVAL を用いたソースを書くことで, 手元でのコンパイル結果と本選競技システム上のコンパイル結果を意図的に変えることができる. 例えば, ソース中に
#ifndef EVAL
printf(“debug:%d\n”,i);
#endif
と書くことで, 手元の実行時にはデバッグ情報を出力して, 本選競技システム上での実行時にはデバッグ情報を出力しない, といったことも可能となる.

-std=gnu++20
g++ において C++20 に準拠した言語仕様でコンパイルする (GNU 拡張を有効にする).

-march=native
コンパイラの最適化に関するオプション. 使用するCPU向けの最適化を行う. このオプションの有無によって, プログラムの実行速度が大幅に変わることがある. 手元でコンパイルしてテスト実行する際には, このオプションを常に付けることを勧める.

-O2
コンパイルの最適化に関するオプション. このオプションの有無によって, プログラムの実行速度が大幅に変わることがある. 手元でコンパイルしてテスト実行する際には, このオプションを常に付けることを勧める.

-pipe
コンパイラの実行方法に対するオプション. コンパイル時に一時ファイルを使わずパイプライン処理を行う. このオプションの有無によって, プログラムの実行速度が変わることは基本的にない.

-static
リンカに対するオプション. リンク時に実行バイナリにライブラリが組み込まれる. このオプションの有無によって, プログラムの実行速度が大幅に変わることは基本的にない. 本選競技システムと同一条件でコンパイル・テスト実行するときは, このオプションを付けることを勧める.

-s
リンカに対するオプション. リンク時に実行バイナリからシンボルテーブルと再配置情報を削除する. このオプションの有無によって, プログラムの実行速度が変わることは基本的にない.

詳細は g++ のマニュアル https://gcc.gnu.org/onlinedocs/ (英語サイト) を参照.

オープンコンテストについて

  • 2024 年 2 月 4 日 (日) 19:00 ~ 2 月 5 日 (月) 19:00 (日本時間) に本選競技と同じ課題を使ったオープンコンテストを開催します.
  • この時間枠から自由に連続する 4 時間を選んで参加することが出来ます. オープンコンテストにはどなたでも参加できます.
  • 詳細は オープンコンテストのページ をご覧ください.

個人情報の扱いについて

個人情報の扱いについては, 情報オリンピック日本委員会の「個人情報保護方針」をご覧ください.