JOI logo

第17回日本情報オリンピック (JOI 2017/2018) 
予選競技規則

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

・「質問とその回答」の Q&A にAtCoderコードテスト機能について追記しました. (2017.12.6)
・「質問・問い合わせ」にAtCoder質問機能について追記しました. (2017.12.6)
・JOI 2017/2018 予選競技規則を公表しました. (2017.6.30)

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

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

予選競技注意事項
概要  日本情報オリンピックは個人戦である. 予選競技では 6 問の問題が出題され, それぞれの問題に対するプログラムを作成する.
  • 参加者は, 予選競技が開始されたら, ウェブブラウザで予選競技システムにログインし, 予選競技ページへ進む.
  • ウェブブラウザで問題を閲覧し, 開発用 PC を用いて解答プログラムを作成する.
  • 作成した解答プログラムのソースコードを, 予選競技システムから提出する.
  • 提出されたソースコードは, 予選競技サーバ上でコンパイル・実行・採点される. その結果が参加者に対して, フィードバックとして与えられる.
  • 競技時間内であれば, フィードバックを参考にしながら, 解答プログラムを修正してソースコードを何度でも再提出することができる.
  • 各問題について, 競技時間内に提出したソースコードの得点の最大値が, その問題の得点となる.
  • ソースコードの再提出によるペナルティは無い.
(注意) 今年度の予選競技実施方法は昨年度までとは大きく異なる. 出力データではなく, ソースコードを提出する形式であることに注意すること.
質問・問い合わせ  質問や問い合わせは info@ioi-jp.org 宛の電子メール,または,AtCoder のコンテストシステム上の「質問」欄で行うこと. ただし, 予選競技時間中に質問に回答することはない. また, 電話などその他の方法での質問は受け付けない.(2017/12/6 AtCoderの質問機能について追記)
会場  予選では特定の会場は設けない. 自宅や学校などで, 自分の PC あるいは学校の PC などを使って競技に参加すること.
ウェブブラウザ  予選で使用予定の PC とブラウザの表示と動作を, 予選練習時 (次項「予選練習」を参照) に確認すること. 必要に応じて, 支障なく競技に参加できるブラウザや開発環境を, 予選競技開始までにインストールしておくこと.
予選練習  2017年11月28日(火)12:00 から2017年12月10日(日)11:00 (競技開始 2 時間前) まで, 予選競技システムにログインすることで予選練習に参加できる.
 予選練習では, 予選競技システムの操作方法や, 問題文の表示方法, ソースコードの提出方法, フィードバックの形式が確認できる.
第17回日本情報オリンピック (JOI 2017/2018) 予選競技規則
不正禁止  本規則を遵守すること. 規則を破った場合は失格となる. 特に, 競技中に第三者の助けを借りたり, 他の参加者の助けとなる行為は禁止されていることに注意すること.
競技時間  3時間 (2017年12月10日(日) 13:00〜16:00)
問題数  6 問
配 点  配点は全問一律で各問 100 点であり, 満点は 600 点となる. 問題ごとに複数の採点用入力データを用いて採点を行う. 採点方法については「採点方法」を参照のこと.
解答方法
  • 各問題について, 問題文の趣旨に合致するプログラムを作成して, ソースコードを提出すること.
  • 問題ごとに, 採点用入力データ 1 個あたりの実行時間制限と使用メモリ制限が定められている. 採点用入力データの中には, 実行時間制限と使用メモリ制限の両方を満たして実行するためには, アルゴリズムの工夫が必要なデータが含まれていることがある. もし, 一部の採点用入力データについてのみ実行時間制限と使用メモリ制限の両方を満たして実行されるソースコードを提出した場合は, その分の出力が正しければ, 部分点が与えられることもある. 部分点についての詳細は, 問題文に記載する.
  • 問題ごとに異なるプログラミング言語を使用して解答することも可能である. 例えば, 問題 1 のプログラムを C++ で作成して, 問題 2 のプログラムを Java で作成するなど, 問題ごとに異なるプログラミング言語を使うこともできる.
プログラムの
入出力方法
 問題文の指示に従い, 標準入力から入力データを読み込み, 標準出力に出力データを書き出すプログラムを作成すること.
 予選練習を利用して, あらかじめ, プログラムの入出力方法を確認しておくことを勧める.
採点用入力データ
の形式
 提出されたソースコードは, 予選競技サーバ上でコンパイル・実行され, 採点が行われる. 与えられる採点用入力データの形式は以下の通りである.
  • 標準入力から採点用入力データを読み込むこと.
  • 採点用入力データの各行は, 1 つまたは複数の項目を含む. 項目は整数または文字列である.
  • 複数の項目を含む行では, 項目は 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 以外の言語を用いた場合, 使用する言語によっては実行速度が遅く, 模範解答として想定されているアルゴリズムを用いても満点を得ることが難しかったり不可能な場合もあるかもしれない.
 予選練習を利用して, 使用予定の言語について, あらかじめソースコードの作成方法と提出方法を確認しておくことを勧める.

 2017年6月30日時点で AtCoder のコンテストシステムで使用可能な言語のバージョン・コンパイル方法・実行方法および使用可能ライブラリは以下の通り (AtCoderのページの「言語」の項と同じ). ただし, これらは, 今後 AtCoder のコンテストシステムが変更になった場合には変更となる可能性がある.
言語コンパイル・インタプリタ実行方法
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
Bash (GNU bash v4.3.11)cat Main.sh | tr -d '\r' >a.outbash a.out
C (GCC 5.4.1)gcc -std=gnu11 -O2 -o a.out Main.c -lma.out
C (Clang 3.8.0)clang -O2 Main.c -o a.out -lma.out
C++ (GCC 5.4.1)g++ -std=gnu++03 -O2 -I/opt/boost/gcc/include -L/opt/boost/gcc/lib -o a.out Main.cppa.out
C++ (Clang 3.8.0)clang++ -I/usr/local/include/c++/v1 -L/usr/local/lib -I/opt/boost/clang/include -L/opt/boost/clang/lib -std=c++03 -stdlib=libc++ -O2 -o a.out Main.cppa.out
C++14 (Clang 3.8.0)clang++ -I/usr/local/include/c++/v1 -L/usr/local/lib -I/opt/boost/clang/include -L/opt/boost/clang/lib -std=c++14 -stdlib=libc++ -O2 -o a.out Main.cppa.out
C# (Mono 4.6.2.0)mcs -warn:0 -o+ -r:System.Numerics Main.csmono Main.exe
Clojure (1.8.0)echojava -cp /opt/clojure/clojure-1.8.0.jar clojure.main Main.clj
Common Lisp (SBCL 1.1.14)echosbcl --script Main.lisp
D (DMD64 v2.070.1)dmd -m64 -w -O -release -inline Main.dMain
D (LDC 0.17.0)ldc2 -O Main.d -of a.outa.out
D (GDC 4.9.4)gdc-4.9 -O2 -frelease -o a.out Main.da.out
Fortran (gfortran v4.8.4)gfortran -O2 -o a.out Main.f08a.out
Go (1.6)go build -o a.out Main.goa.out
Haskell (GHC 7.10.3)ghc -o a.out -O2 Main.hsa.out
Java7 (OpenJDK 1.7.0)/usr/lib/jvm/java-7-openjdk-amd64/bin/javac Main.java/usr/lib/jvm/java-7-openjdk-amd64/bin/java -Xss256M Main
Java8 (OpenJDK 1.8.0)/usr/lib/jvm/java-8-openjdk-amd64/bin/javac Main.java/usr/lib/jvm/java-8-openjdk-amd64/bin/java -Xss256M Main
JavaScript (node.js v5.12.0)echonode Main.js
OCaml (4.02.3)bash -c 'eval $(opam config env) ocamlfind ocamlopt -o a.out Main.ml -linkpkg -thread -package str,num,threads,batteries'a.out
Pascal (FPC 2.6.2)fpc -O2 -Sd -Sh -oa.out Main.pasa.out
Perl (v5.18.2)perl -W -c Main.plperl -X Main.pl
PHP (5.6.30)php5.6 -l Main.phpphp5.6 Main.php
Python2 (2.7.6)echopython -B Main.py
Python3 (3.4.3)echopython3 -B Main.py
Ruby (2.3.3)ruby2.3 --disable-gems -w -c Main.rbruby2.3 --disable-gems Main.rb
Scala (2.11.7)scalac -optimise Main.scalascala Main
Scheme (Gauche 0.9.3.3)echogosh Main.scm
Text (cat)cat Main.txt | tr -d '\r' >a.outcat a.out
Visual Basic (Mono 4.0.1)vbnc /noconfig /r:Accessibility.dll /r:System.dll /r:System.Data.dll /r:System.Xml.dll /r:System.Core.dll /r:System.Numerics.dll /r:System.Configuration.dll /r:System.Xml.dll /imports:System /imports:Microsoft.VisualBasic /OptionExplicit+ /removeintchecks+ /optimize+ /debug- Main.vbmono Main.exe
Objective-C (GCC 5.3.0)gcc -O2 Main.m -o a.out -lobjc -lgnustep-base -I/usr/include/GNUstep -fconstant-string-class=NSConstantStringa.out
Objective-C (Clang 3.8.0)clang -O2 Main.m -o a.out -lobjc -lgnustep-base -I/usr/lib/gcc/x86_64-linux-gnu/4.8/include/ -I/usr/include/GNUstep -fconstant-string-class=NSConstantStringa.out
Swift (swift-2.2-RELEASE)swiftc -o a.out Main.swifta.out
Rust (1.15.1)rustc -O -o a.out Main.rsa.out
Sed (GNU sed 4.2.2)cat Main.sed | tr -d '\r' >a.outsed -f a.out
Awk (mawk 1.3.3)cat Main.awk | tr -d '\r' >a.outawk -f a.out
Brainfuck (bf 20041219)cat Main.bf | tr -d '\r' >a.outbf a.out
Standard ML (MLton 20100608)mlton -output a.out Main.mla.out
PyPy2 (5.6.0)echopypy Main.py
PyPy3 (2.4.0)echopypy3 Main.py
Crystal (0.20.5)crystal build Main.crMain
F# (Mono 4.0)fsharpc Main.fsmono Main.exe
Unlambda (0.1.3)cat Main.unl | tr -d '\r' >a.outsh -c 'cat a.out - | unlambda'
Lua (5.3.2)luac -o luac.out Main.lualua luac.out
LuaJIT (2.0.4)luajit -O3 -b Main.lua luac.outluajit -O3 luac.out
MoonScript (0.5.0)moonc -o a.out Main.moonmoon Main.moon
Ceylon (1.2.1)ceylon compile --source=. Main.ceylonceylon run --run main default
Julia (0.5.0)echojulia Main.jl
Octave (4.0.2)echooctave --jit-compiler Main.m
Nim (0.13.0)nim c -d:release -o:a.out Main.nima.out
TypeScript (2.1.6)tsc Main.tsnode Main.js
Perl6 (rakudo-star 2016.01)perl6 -W -c Main.p6perl6 Main.p6
Kotlin (1.0.0)kotlinc Main.kt -include-runtime -d Main.jarkotlin -classpath Main.jar -J-Xss256M MainKt
PHP7 (7.0.15)php7.0 -l Main.phpphp7.0 Main.php
対象言語ライブラリ名補足
C++(g++/clang++)Boostバージョン: 1.60.0
Python2numpyapt-get install python-numpy で入るもの
Python2scipyapt-get install python-scipy で入るもの
Python2? Python3?scikitsapt-get install python-scikits-learn で入るもの
Python3numpyapt-get install python3-numpy で入るもの
Python3scipyapt-get install python3-scipy で入るもの
SwiftFoundationバージョン: swift-2.2-SNAPSHOT-2016-01-11-a
SwiftXCTestバージョン: swift-2.2-SNAPSHOT-2016-01-11-a
使用できる
機種・OS
 インターネットに接続でき, 開発環境とウェブブラウザがインストールされている PC であれば機種や OS に制限はない.
使用できるPC
の台数
 予選競技中に, 開発に使用できる PC は 1 台だけである.
 ただし, 開発以外の目的で複数の PC を使用することは許される. 例えば, 開発用 PC とは別の PC (タブレットやスマ―トフォンなど) で問題文を閲覧しながら, 開発用 PC の上でプログラムを作成・実行して予選競技に参加することは許される.
PC 共用の禁止  予選競技中, 複数の競技参加者が 1 台の PC を共用することを禁止する. また, 競技に使用する PC を競技参加者以外の第三者が操作することも禁止する.
ネットワークへの
アクセスについて
 予選競技中, 競技参加者は, 本競技規則の他の項目に抵触しない範囲でネットワークにアクセスすることができる.
 例えば, 問題の閲覧, 結果の提出, このページ (注意事項と競技規則) の閲覧, 情報オリンピック日本委員会との通信, 開発環境に付属するオンラインマニュアルの利用, インターネット上で公開されている情報を検索して競技に利用することは, 許される.
 ただし, 予選競技中に Twitter, Facebook, ブログ, SNS などを用いて情報発信したり, チャット, Skype, LINE, メールやインターネットの質問サイトなどを用いて第三者の助けを借りることは, 「第三者とのやり取りの禁止」に抵触するので, 許されない.
使用禁止の
アプリケーション
 開発環境, ウェブブラウザ, 参考資料を閲覧するために必要なアプリケーション, 情報オリンピック日本委員会との通信のために使用するメーラ以外のアプリケーションの使用を禁止する. ただし, Mathematica, Maple, MuPad, Maxima などの数式処理ソフト, および, Excel などの表計算ソフトは開発環境であると解釈し, これらを使用して解答を作成することを認める.
ライブラリの利用  予選競技では, 開発環境に付随しているライブラリや, インターネット上で公開されている外部ライブラリを使用することができる.
 ただし, ソースコードを提出する際は, ソースコードを 1 つのファイルにまとめて, ソースコード提出欄より提出する必要がある.
 予選練習を利用して, あらかじめ, ソースコードの作成方法と提出方法を確認しておくことを勧める.
参考資料の閲覧  予選競技中に参考資料を閲覧することは許される. 具体的には,
  • 競技中に占用できる参考書などの書籍
  • 開発環境に付随しているマニュアルやヘルプ(オンラインマニュアルやオンラインヘルプを含む)
  • 予選競技前や予選競技中に検索して入手した資料やサンプルプログラム
を使用して競技に参加することは許される. また,
  • 入手したサンプルプログラムなどをコピー&ペーストなどで解答プログラムに活用すること
  • ブログやインターネットの質問サイトに書かれた内容を, 検索して利用すること
も許される.
 ただし, 予選競技開始後でかつ予選競技終了前にブログやインターネットの質問サイトに書き込みを行うことは, 「第三者とのやり取りの禁止」に抵触するので, 許されない.
質問とその回答
Q: 統合開発環境を用いて予選競技に参加する予定です. 注意すべきことはありますか?
A: 「ソースコードの提出方法」には,「作成したプログラムのソースコードを 1 つのファイルにまとめて, ソースコード提出欄に入力して提出すること」と定められています. 統合開発環境の設定によっては, 作成したソースコードが複数のファイルに分かれることもあるかもしれません. 予選練習を利用して, あらかじめ, ソースコードの作成方法と提出方法を確認しておくことをお勧めします.
Q: インライン関数は使用可能でしょうか? C/C++ で 64 bit 型の整数を扱う場合, long long int の代わりに __int64 を使ってコードを書いてもよいのでしょうか?汎用性の無い処理系依存のプログラムを書いても構わないのでしょうか?
A: 予選競技では, AtCoder のシステムを使用して, 提出されたソースコードのコンパイル・実行を行います. AtCoder のシステムにおける言語ごとのコンパイル方法や言語ごとの実行方法については, AtCoderのページの「言語」の項を参照してください. 予選練習を利用して, あらかじめ, どのような機能が使用可能か確認しておくことをお勧めします.
Q: 開発環境がインストールされた PC がインターネットに接続されていません. 開発用 PC とは別の PC から問題文をダウンロードしたり, 解答ファイルをアップロードすることは許されますか?
A: 許されます. 「使用できる PC の台数」の項において, 「予選競技中に, 開発に使用できる PC は 1 台だけである. 」と定められています. 開発以外の目的で複数の PC を使用することは許されます. ただし, 複数の競技参加者が共用することは許されません (「PC 共用の禁止」の項を参照してください).
Q: ネット上のコンパイラ (ソースをアップロードすると実行結果を返してくれるウェブサービス) を利用して予選競技に参加することはできますか.
A: 競技参加者は,AtCoder のコンテストシステム上のコードテスト機能を利用して予選競技に参加することができます. AtCoder のコンテストシステム以外のウェブサービスを利用して予選競技に参加することはできません.第三者とのやり取りの禁止には, 「予選競技中, 競技参加者はいかなる第三者とも, いかなる方法でも相談や情報のやり取りをしてはならない」と定められています. したがって, 予選競技時間中に, 予選競技システム以外の場所に自分自身のソースコードをアップロードすることはできません. そのような行為を行った場合, ソースコードが第三者の目に触れる可能性があり, 予選競技規則に違反する可能性があります. 予選競技には, 自分自身の PC にインストールされた開発環境を用いて参加してください.(2017/12/6 AtCoder のコンテストシステム上のコードテスト機能についての説明を加筆しました)