JOI logo

第20回日本情報オリンピック (JOI 2020/2021) 
二次予選競技規則

2020年6月30日
情報オリンピック日本委員会

・JOI 2020/2021 二次予選競技規則を公表しました. (2020.6.30)

二次予選競技注意事項 二次予選競技規則 質問とその回答

よくある質問とその回答です. 実際にあった質問については, 公開に適するよう表現を修正しています.
質問とその回答へ

二次予選競技注意事項
概要  日本情報オリンピックは個人戦である. 二次予選競技では 5 問の問題が出題され, それぞれの問題に対するプログラムを作成する.
  • 参加者は, 二次予選競技が開始されたら, ウェブブラウザで二次予選競技システムにログインし, 二次予選競技ページへ進む.
  • ウェブブラウザで問題を閲覧し, 開発用 PC を用いて解答プログラムを作成する.
  • 作成した解答プログラムのソースコードを, 二次予選競技システムから提出する.
  • 提出されたソースコードは, 二次予選競技サーバ上でコンパイル・実行・採点される. その結果が参加者に対して, フィードバックとして与えられる.
  • 競技時間内であれば, フィードバックを参考にしながら, 解答プログラムを修正してソースコードを何度でも再提出することができる.
  • 各問題について, 競技時間内に提出したソースコードの得点の最大値が, その問題の得点となる.
  • ソースコードの再提出によるペナルティは無い.
質問・問い合わせ  質問や問い合わせは info@ioi-jp.org 宛の電子メール,または,AtCoder のコンテストシステム上の「質問」欄で行うこと. ただし, 二次予選競技時間中に質問に回答することはない. また, 電話などその他の方法での質問は受け付けない. 重要な情報は参加者全員へのお知らせとして掲出する.
会場  予選では特定の会場は設けない. 自宅や学校などで, 自分の PC あるいは学校の PC などを使って競技に参加すること.
ウェブブラウザ  予選で使用予定の PC とブラウザの表示と動作を, 予選練習時 (次項「予選練習」を参照) に確認すること. 必要に応じて, 支障なく競技に参加できるブラウザや開発環境を, 二次予選競技開始までにインストール・準備しておくこと.
予選練習  2020年9月7日(月)12:00 から2020年12月13日(日)11:00 (二次予選競技開始 2 時間前) まで, AtCoder コンテストシステムに JOI 2020/2021 競技用 ID/PW でログインすることで予選練習に参加できる.
 予選練習では, 予選競技システムの操作方法や, 問題文の表示方法, ソースコードの提出方法, フィードバックの形式が確認できる.
 自分が参加する予選の競技開始までに, 予選練習で競技方式・競技環境などを確認すること.
第20回日本情報オリンピック (JOI 2020/2021) 二次予選競技規則
不正禁止  本規則を遵守すること. 規則を破った場合は失格となる. 特に, 競技中に第三者の助けを借りたり, 他の参加者の助けとなる行為は禁止されていることに注意すること.
競技時間  180分間 (2020年12月13日 13:00 〜 16:00)
問題数   5問
配 点  配点は全問一律で各問 100 点であり, 満点は 500 点となる. 問題ごとに複数の採点用入力データを用いて採点を行う. 採点方法については「採点方法」を参照のこと.
解答方法
  • 各問題について, 問題文の趣旨に合致するプログラムを作成して, ソースコードを提出すること.
  • 問題ごとに, 採点用入力データ 1 個あたりの実行時間制限と使用メモリ制限が定められている. 採点用入力データの中には, 実行時間制限と使用メモリ制限の両方を満たして実行するためには, アルゴリズムの工夫が必要なデータが含まれていることがある. もし, 一部の採点用入力データについてのみ実行時間制限と使用メモリ制限の両方を満たして実行されるソースコードを提出した場合は, その分の出力が正しければ, 部分点が与えられることもある. 部分点についての詳細は, 問題文に記載する.
  • 問題ごとに異なるプログラミング言語を使用して解答することも可能である. 例えば, 問題 1 のプログラムを C++ で作成して, 問題 2 のプログラムを Java で作成するなど, 問題ごとに異なるプログラミング言語を使うこともできる.
プログラムの
入出力方法
 問題文の指示に従い, 標準入力から入力データを読み込み, 標準出力に出力データを書き出すプログラムを作成すること.
 予選練習を利用して, あらかじめ, プログラムの入出力方法を確認しておくことを勧める.
採点用入力データ
の形式
 提出されたソースコードは, 二次予選競技サーバ上でコンパイル・実行され, 採点が行われる. 与えられる採点用入力データの形式は以下の通りである.
  • 標準入力から採点用入力データを読み込むこと.
  • 採点用入力データの各行は, 1 つまたは複数の項目を含む. 項目は整数または文字列である.
  • 複数の項目を含む行では, 項目は 1 つの「空白」で区切られている. ここで, 「空白」とは半角空白のことであり, 全角空白やタブは「空白」ではない.
  • 各行において, 1 つ目の項目の前や, 最後の項目の後に「空白」はない.
ソースコードの
提出方法
ソースコードの提出は, 二次予選競技システムの「提出」ページより提出する「問題」と使用したプログラミング「言語」を正しく選択し, 「ソースコード」欄に使用する開発環境やテキストエディタから作成したソースコードを入力またはコピー&ペーストして, 「ソースコードを提出する」ボタンをクリックして提出すること.
 ソースコードは, 競技時間中であれば, 何度でも再提出することが可能である. ただし, 二次予選競技終了時間直前は, 提出が集中して時間がかかる可能性がある. 早めに提出するとともに, 無用な提出を避けること.
 予選練習を利用して, あらかじめ, ソースコード提出方法を確認しておくことを勧める.
出力データの形式  提出されたソースコードは, 二次予選競技サーバ上で正常にコンパイル・実行された場合に, 採点が行われる. 以下に従い, 出力データを出力すること.
  • 出力データを標準出力に出力すること.
  • 出力データは, 問題文の指示にない文字・記号・制御コードを含まないこと.
  • 出力データの行数は, 問題中の「出力」の項に指定された行数であること. 出力データの行数が問題中に指定された行数と異なる場合は, 不正解となることがある.
  • 出力データの各行は, 1 つまたは複数の項目を含むこと. 項目は整数または文字列である.
  • 出力データの各行に含まれる項目数は, 問題中の「出力」の項に指定されたその行の項目数と一致すること. 異なる場合は不正解となることがある.
  • 複数の項目を含む行では, 項目を 1 つの「空白」で区切ること. また, 1 つ目の項目の前や最後の項目の後に「空白」を挿入しないこと. これらに反する出力データは不正解となることがある. ここで, 「空白」とは半角空白のことであり, 全角空白やタブは「空白」ではない.
  • 各行において, 1 つ目の項目の前や, 最後の項目の後に「空白」を入れないこと. 1 つ目の項目の前や, 最後の項目の後に「空白」が含まれている出力データは不正解となることがある.
  • 項目が整数の場合, 次のように出力(表記)すること.
    正整数
    正整数は, 数字(0 から 9 まで)を用い十進法で表すこと. 先頭が 0 であってはならないし, 符号や小数点をつけてはならない.
        良い例: 123
        悪い例: +123    123.0    0123
    零は 0 で表すこと.
        悪い例: +0    -0    0.0    00
    負整数
    負整数は, 負号(-)の後に 1 個以上の数字を並べ十進法で表すこと. 符号の直後の数字は 0 であってはならない.
        良い例: -123
        悪い例: -123.0    -0123
  • 項目が文字列の場合, 1 個以上の文字の並びとして出力すること.
採点方法
  • 提出されたソースコードは, 二次予選競技サーバ上でコンパイル・実行・採点される. その結果は, 参加者に対して, フィードバックとして与えられる.
  • 二次予選競技サーバ上で正常にコンパイルできないソースコードに対する得点は, 0 点である.
  • 二次予選競技サーバ上で正常にコンパイルされたソースコードに対して, 採点が行われる.
  • 採点は, 1 個または複数の採点用入力データをセットにして行われる. セット内のすべての採点用入力データに対して, 定められた実行時間制限・使用メモリ制限を満たして実行され, 正しい出力データを出力した場合に, そのセット分の得点が与えられる.
  • 競技時間内であれば, ソースコードを何度でも再提出することができる.
  • ソースコードの再提出によるペナルティは無い.
  • 各問題について, 競技時間内に提出したソースコードの得点の最大値が, その問題の得点となる.
第三者との
やり取りの禁止
 二次予選競技中, 競技参加者はいかなる第三者とも, いかなる方法でも相談や情報のやり取りをしてはならない. そのため, 競技中は, 例えば, Twitter, Facebook, ブログなどへの書き込み, SNS の利用, Skype, LINE, チャットの利用, 電子メールの送受信 (情報オリンピック日本委員会とのやりとりを除く) は許されない.
使用できる
プログラミング言語
 二次予選競技は, AtCoder のコンテストシステムで行う.
 二次予選競技では, C 言語, C++, Java が使用できる. これ以外にも, 二次予選競技実施時に AtCoder のコンテストシステムで使用可能なプログラミング言語であれば, どの言語でも使用することができる.
 ただし, C 言語, C++, Java 以外の言語を用いた場合, 使用する言語によっては実行速度が遅く, 模範解答として想定されているアルゴリズムを用いても満点を得ることが難しかったり不可能な場合もあるかもしれない.
 予選練習を利用して, 使用予定の言語について, あらかじめソースコードの作成方法と提出方法を確認しておくことを勧める.

 2020年6月23日時点で AtCoder のコンテストシステムで使用可能な言語のバージョン・コンパイル方法・実行方法および使用可能ライブラリは以下の通り (AtCoderのページの「言語」の項と同じ). ただし, これらは, 今後 AtCoder のコンテストシステムが変更になった場合には変更となる可能性がある.
言語コンパイル・インタプリタ実行コマンド
C (GCC 9.2.1)gcc -std=gnu11 -O2 -DONLINE_JUDGE -o ./a.out ./Main.c -lm./a.out
C (Clang 10.0.0)clang -std=c11 -O2 -DONLINE_JUDGE -o ./a.out ./Main.c -lm./a.out
C++ (GCC 9.2.1)g++ -std=gnu++17 -Wall -Wextra -O2 -DONLINE_JUDGE -I/opt/boost/gcc/include -L/opt/boost/gcc/lib -o ./a.out ./Main.cpp./a.out
C++ (Clang 10.0.0)clang++ -std=c++17 -stdlib=libc++ -Wall -O2 -DNDEBUG -DONLINE_JUDGE -I/opt/boost/clang/include -L/opt/boost/clang/lib -o ./a.out ./Main.cpp./a.out
Java (OpenJDK 11.0.6)/usr/lib/jvm/java-11-openjdk-amd64/bin/javac ./Main.java/usr/lib/jvm/java-11-openjdk-amd64/bin/java -Xss256M Main
Python (3.8.2)bash -c 'python3.8 ./Main.py ONLINE_JUDGE 2>/dev/null'python3.8 ./Main.py
Bash (5.0.11)bash ./Main.sh
bc (1.07.1)bc --mathlib ./Main.bc
Awk (GNU Awk 4.1.4)awk -f ./Main
C# (.NET Core 3.1.201)bash -c 'cp ./Main.cs ./../csharp/Program.cs && dotnet publish ./../csharp -c Release -r ubuntu.18.04-x64 -p:PublishReadyToRun=true -o . -v q --nologo 1>&2'./csharp
C# (Mono-mcs 6.8.0.105)mcs -warn:0 -o+ -unsafe -r:System.Numerics -langversion:latest ./Main.cs -out:./Main.exemono ./Main.exe
C# (Mono-csc 3.5.0)csc -warn:0 -o+ -unsafe -r:System.Numerics.dll -langversion:latest ./Main.cs -out:./Main.exemono ./Main.exe
Clojure (1.10.1.536)clojure -J-Xss256M ./Main.clj
Crystal (0.33.0)crystal build --release --no-debug --no-color -o ./a.out ./Main.cr./a.out
D (DMD 2.091.0)bash -c 'dmd -wi -m64 -O -release -inline -boundscheck=off -of=./a.out `dub list | head -n-1 | tail -n+3 | awk "{print \"-I\" \\$3 \"source\"}" | xargs` ./Main.d'./a.out
D (GDC 9.2.1)gdc -O2 -frelease -o ./a.out ./Main.d./a.out
D (LDC 1.20.1)ldc2 -O -release -of ./a.out ./Main.d./a.out
Dart (2.7.2)dart2native ./Main.dart -o ./a.out./a.out
dc (1.4.1)dc -f ./Main.dc
Erlang (22.3)bash -c 'erlc Main.erl 1>&2'erl -noshell -run Main main run erlang halt
Elixir (1.10.2)bash -c 'elixirc ./Main.ex -o . 1>&2'elixir -pa . -e Main.main
F# (.NET Core 3.1.201)bash -c 'cp ./Main.fs ./../fsharp/Program.fs && dotnet publish ./../fsharp -c Release -r ubuntu.18.04-x64 -o . -v q --nologo 1>&2'./fsharp
F# (Mono 10.2.3)fsharpc -O -o ./a.exe ./Main.fsmono ./a.exe
Forth (gforth 0.7.3)gforth-fast ./Main.fs -e bye
Fortran(GNU Fortran 9.2.1)gfortran -O2 -o ./a.out ./Main.f08./a.out
Go (1.14.1)go build -buildmode=exe -o ./a.out ./Main.go./a.out
Haskell (GHC 8.8.3)ghc -o a.out -O2 ./Main./a.out
Haxe (4.0.3); jshaxe -cp . -main Main -js ./Main.js -lib hxnodejsnode ./Main.js
Haxe (4.0.3); Javahaxe -m Main -cp . --java .java -Xss256M -jar ./Main.jar
JavaScript (Node.js 12.16.1)node ./Main.js --stack-size=262144
Julia (1.4.0)bash -c 'julia ./Main.jl ONLINE_JUDGE 2>/dev/null'julia ./Main.jl
Kotlin (1.3.71)kotlinc ./Main.kt -include-runtime -d ./Main.jar -XXLanguage:+InlineClasses/usr/lib/jvm/java-11-openjdk-amd64/bin/java -cp ./Main.jar MainKt -Xss256m
Lua (Lua 5.3.5)luac -o ./luac.out ./Main.lualua ./luac.out
Lua (LuaJIT 2.1.0)luajit -O3 -b ./Main.lua ./luac.outluajit -O3 ./luac.out
Dash (0.5.8)sh ./Main.sh
Nim (1.0.6)nim cpp -d:release --opt:speed --multimethods:on --warning[SmallLshouldNotBeUsed]:off --hints:off -o:./a.out ./Main.nim./a.out
Objective-C (Clang 10.0.0)bash -c 'clang $(gnustep-config --objc-flags) -I/usr/lib/gcc/x86_64-linux-gnu/7/include -o ./a.out ./Main.m $(gnustep-config --base-libs)'./a.out
Common Lisp (SBCL 2.0.3)sbcl --noinform --eval '(compile-file "./Main")' --quitsbcl --script ./Main.fasl
OCaml (4.10.0)bash -c 'eval $(opam env) ocamlfind ocamlopt -O2 -o ./a.out ./Main.ml -linkpkg -thread -package str,num,threads,containers,core,iter,batteries'./a.out
Octave (5.2.0)flatpak run org.octave.Octave -W ./Main.m
Pascal (FPC 3.0.4)fpc -O2 -Sd -Sh -o./a.out ./Main.pas./a.out
Perl (5.26.1)perl -W -c ./Main.plperl -X ./Main.pl
Raku (Rakudo 2020.02.1)perl6 -c ./Main.p6perl6 ./Main.p6
PHP (7.4.4)php -l ./Main.phpphp ./Main.php
Prolog (SWI-Prolog 8.0.3)swipl -O -g main -o ./Main -c ./Main.pl./Main
PyPy2 (7.3.0)pypy ./Main.py
PyPy3 (7.3.0)pypy3 ./Main.py
Racket (7.6)raco exe -o ./a.out ./Main.rkt./a.out
Ruby (2.7.1)ruby -w -c ./Main.rbbash -c 'RUBY_THREAD_VM_STACK_SIZE=268435456 ruby ./Main.rb'
Rust (1.42.0)bash -c 'cp ./Main.rs ./../rust/src/main.rs && cargo build --release --offline --quiet --manifest-path=/imojudge/rust/Cargo.toml && cp ./../rust/target/release/main ./a.out'./a.out
Scala (2.13.1)bash -c 'JAVACMD=/usr/lib/jvm/java-8-openjdk-amd64/bin/java scalac -opt:_ -opt-inline-from:'**' -opt-warnings:_ -deprecation -d . ./Main.scala'bash -c 'JAVACMD=/usr/lib/jvm/java-8-openjdk-amd64/bin/java scala -J-Xss256M -classpath . Main'
Java (OpenJDK 1.8.0)/usr/lib/jvm/java-8-openjdk-amd64/bin/javac ./Main.java/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Xss256M Main
Scheme (Gauche 0.9.9)gosh precomp -e ./Main.scmgosh ./Main.scm
Standard ML (MLton 20130715)mlton -output ./a.out ./Main.sml./a.out
Swift (5.2.1)swiftc -Ounchecked -o ./a.out ./Main.swift./a.out
Text (cat 8.28)cat ./Main.txt
TypeScript (3.8)bash -c 'ln -s /usr/lib/node_modules ./node_modules; tsc ./Main.ts --target ESNext --outDir . --moduleResolution node --module commonjs'node ./Main.js --stack-size=262144
Visual Basic (.NET Core 3.1.101)bash -c 'cp ./Main.vb ./../visualbasic/Program.vb && dotnet publish ./../visualbasic -c Release -r ubuntu.18.04-x64 -o . -v q --nologo 1>&2'./visualbasic
Zsh (5.4.2)zsh ./Main.sh
COBOL - Fixed (OpenCOBOL 1.1.0)cobc -x -O2 -o ./a.out ./Main.cob./a.out
COBOL - Free (OpenCOBOL 1.1.0)cobc -x -free -O2 -o ./a.out ./Main.cob./a.out
Brainfuck (bf 20041219)bf -c999999999 ./Main.bf
Ada2012 (GNAT 9.2.1)gnat-9 make -O3 -o ./a.out ./Main.adb./a.out
Unlambda (2.0.0)unlambda ./Main.unl
Cython (0.29.16)bash -c 'cython -3 --embed ./Main.pyx; gcc -O2 -fPIC -I/usr/include/python3.8 -I/usr/local/lib/python3.8/dist-packages/numpy/core/include -o ./a.out ./Main.c -lpython3.8'./a.out
Sed (4.4)sed -f ./Main.sed
Vim (8.2.0460)bash -c 'cat - > /tmp/out; TERM=dumb vim -N -u NONE -i NONE -s ./Main.vim /tmp/out > /dev/null 2>&1; cat /tmp/out'
言語コンパイル・インタプリタ実行方法
C++14 (GCC 5.4.1)g++ -std=gnu++1y -O2 -I/opt/boost/gcc/include -L/opt/boost/gcc/lib -o a.out Main.cppa.out
使用できる
機種・OS
 インターネットに接続でき, 開発環境とウェブブラウザがインストールされている PC であれば機種や OS に制限はない.
使用できるPC
の台数
 二次予選競技中に, 開発に使用できる PC は 1 台だけである.
 ただし, 開発以外の目的で複数の PC を使用することは許される. 例えば, 開発用 PC とは別の PC (タブレットやスマ―トフォンなど) で問題文を閲覧しながら, 開発用 PC の上でプログラムを作成・実行して二次予選競技に参加することは許される.
PC 共用の禁止  二次予選競技中, 複数の競技参加者が 1 台の PC を共用することを禁止する. また, 競技に使用する PC を競技参加者以外の第三者が操作することも禁止する.
ネットワークへの
アクセスについて
 二次予選競技中, 競技参加者は, 本競技規則の他の項目に抵触しない範囲でネットワークにアクセスすることができる.
 例えば, 問題の閲覧, 結果の提出, このページ (注意事項と競技規則) の閲覧, 情報オリンピック日本委員会との通信, 開発環境に付属するオンラインマニュアルの利用, インターネット上で公開されている情報を検索して競技に利用することは, 許される.
 ただし, 二次予選競技中に Twitter, Facebook, ブログ, SNS などを用いて情報発信したり, チャット, Skype, LINE, メールやインターネットの質問サイトなどを用いて第三者の助けを借りることは, 「第三者とのやり取りの禁止」に抵触するので, 許されない.
使用禁止の
アプリケーション
 開発環境, ウェブブラウザ, 参考資料を閲覧するために必要なアプリケーション, 情報オリンピック日本委員会との通信のために使用するメーラ以外のアプリケーションの使用を禁止する. ただし, Mathematica, Maple, MuPad, Maxima などの数式処理ソフト, および, Excel などの表計算ソフトは開発環境であると解釈し, これらを使用して解答を作成することを認める.
ライブラリの利用 使用できるプログラミング言語」を参照のこと.
参考資料の閲覧  二次予選競技中に参考資料を閲覧することは許される. 具体的には,
  • 競技中に占用できる参考書などの書籍
  • 開発環境に付随しているマニュアルやヘルプ(オンラインマニュアルやオンラインヘルプを含む)
  • 二次予選競技前や二次予選競技中に検索して入手した資料やサンプルプログラム
を使用して競技に参加することは許される. また,
  • 入手したサンプルプログラムなどをコピー&ペーストなどで解答プログラムに活用すること
  • ブログやインターネットの質問サイトに書かれた内容を, 検索して利用すること
も許される.
 ただし, 二次予選競技開始後でかつ二次予選競技終了前にブログやインターネットの質問サイトに書き込みを行うことは, 「第三者とのやり取りの禁止」に抵触するので, 許されない.
質問とその回答
Q1: 統合開発環境を用いて二次予選競技に参加する予定です. 注意すべきことはありますか?
A1: 二次予選競技では, AtCoder のシステムを使用して, 提出されたソースコードのコンパイル・実行を行います. AtCoder のシステムにおける言語ごとのコンパイル方法や言語ごとの実行方法については, AtCoderのページの「言語」の項を参照してください. 予選練習を利用して, あらかじめ, どのような機能が使用可能か確認しておくことをお勧めします.
Q2: インライン関数は使用可能でしょうか? C/C++ で 64 bit 型の整数を扱う場合, long long int の代わりに __int64 を使ってコードを書いてもよいのでしょうか?汎用性の無い処理系依存のプログラムを書いても構わないのでしょうか?
A2: 二次予選競技では, AtCoder のシステムを使用して, 提出されたソースコードのコンパイル・実行を行います. AtCoder のシステムにおける言語ごとのコンパイル方法や言語ごとの実行方法については, AtCoderのページの「言語」の項を参照してください. 予選練習を利用して, あらかじめ, どのような機能が使用可能か確認しておくことをお勧めします.
Q3: 開発環境がインストールされた PC がインターネットに接続されていません. 開発用 PC とは別の PC から問題文をダウンロードしたり, ソースコードの提出をすることは許されますか?
A3: 許されます. 「使用できる PC の台数」の項において, 「二次予選競技中に, 開発に使用できる PC は 1 台だけである. 」と定められています. 開発以外の目的で複数の PC を使用することは許されます. ただし, 複数の競技参加者が共用することは許されません (「PC 共用の禁止」の項を参照してください).
Q4: ネット上のコンパイラ (ソースをアップロードすると実行結果を返してくれるウェブサービス) を利用して二次予選競技に参加することはできますか.
A4: 競技参加者は,AtCoder のコンテストシステム上のコードテスト機能を利用して二次予選競技に参加することができます.AtCoder のコンテストシステム以外のウェブサービスを利用して二次予選競技に参加することはできません.第三者とのやり取りの禁止には, 「二次予選競技中, 競技参加者はいかなる第三者とも, いかなる方法でも相談や情報のやり取りをしてはならない」と定められています. したがって, 二次予選競技時間中に, 二次予選競技システム以外の場所に自分自身のソースコードをアップロードすることはできません. そのような行為を行った場合, ソースコードが第三者の目に触れる可能性があり, 二次予選競技規則に違反する可能性があります. 二次予選競技には, 自分自身の PC にインストールされた開発環境を用いて参加してください.