International Olympiad in Informatics 2011 |
ELEPHANTSバージョン: 1.2 |
N 頭の象が「ステージ」と呼ばれる直線上で踊る「踊る象 (Dancing Elephants) 」はパタヤのすごいショーとして知られている.
何年もの訓練により, このショーの象は多くの驚くべきダンスを踊れるようになっている. ショーはいくつかの演技からなる. それぞれの演技は, ちょうど 1 頭の象がかわいいダンスを踊る. 踊りながら, 他の位置に移動することもある.
ショーのプロデューサー達はショー全体の写真が掲載されている本を制作したい. 演技が終わるごとに, 観客から見えるすべての象の写真を撮りたい.
ショーの間, 複数の象が同じ位置にいることがある. この場合, 象は同じ位置の他の象の後ろに立つ.
1 つのカメラで長さ L の区間 (端を含む) にいる象の写真を撮ることができる. 象はステージ全体に広がることもあるので, すべての象のスナップ写真を同時に撮るには複数のカメラが必要かもしれない.
例として, L = 10 とし象がステージ上の 10, 15, 17, 20 の位置にいる場合を考える. このとき, 下図で示すように 1 つのカメラで象の写真を撮ることができる (三角形は象を, 台形はカメラを表す).
次の演技で, 位置 15 の象は位置 32 へ踊って移動する. この演技の後, スナップ写真を撮るためには少なくとも 2 台のカメラが必要である.
次の演技で, 位置 10 の象は位置 7 へ移動する. この象の並び方では, すべての象の写真を撮るために 3 台のカメラが必要である.
この対話型課題では, それぞれの演技の後に写真を撮るために必要なカメラの最小台数を決定しなければならない. 演技の後, 必要なカメラの台数は増加するかもしれないし, 減少するかもしれないし, そのままかもしれない.
次のプロシージャーを実装せよ:
次のパラメータを持つプロシージャー init(N, L, X) :
このプロシージャーは最初の update が呼び出される前に 1 度だけ呼び出される. このプロシージャーは値を返さない.
次のパラメータを持つプロシージャー update(i, y) :
このプロシージャーは複数回呼び出される. 1 回の呼び出しは 1 つの演技に対応する (この演技は, それ以前のすべての演技に続くものである). それぞれの呼び出しは対応する演技の後にすべての象を写真に撮るために必要なカメラの最小台数を返す必要がある.
N = 4, L = 10, 象の初期位置が
X = | 10 |
15 | |
17 | |
20 |
の場合を考える.
最初, プロシージャー init は上記のパラメータで呼び出される. その後, プロシージャー update が 1 つの演技ごとに 1 回ずつ呼び出される. 以下に呼び出しと正しい返り値の例を示す:
演技 | パラメータ | 返り値 |
1 | update(2, 16) | 1 |
2 | update(1, 25) | 2 |
3 | update(3, 35) | 2 |
4 | update(0, 38) | 2 |
5 | update(2, 0) | 3 |
elephants/
elephants.c
または elephants.cpp
または elephants.pas
elephants.h
または elephants.pas
grader.c
または grader.cpp
または grader.pas
grader.in.1
, grader.in.2
,
...grader.expect.1
, grader.expect.2
,
...