#futurecontest2018quala. [future_contest_2018_qual_a]山型足し算

[future_contest_2018_qual_a]山型足し算

問題文

NNNN 列のマス目 AA が与えられます。一番左上のマスの位置を (0,0)(0,0) と定義します。
このとき、左上のマスから下に i(0iN1)i\\ (0 ≦ i ≦ N-1) マス、右に j(0jN1)j\\ (0 ≦ j ≦ N-1) マス進んだマスの位置は (j,i)(j,i) で表されます。
また,各マスに整数が書かれており、位置 (j,i)(j,i) のマスに書かれている整数を Ai,jA_{i,j} で表します。

ここで、マス目に対して全てのマスに書かれている整数が 00 である状態を「初期マス目」と定義します。
また、マス目 PP に対する「山型足し算」 (X,Y,H)(X,Y,H) を以下のように定義します。

  • まず,山の中心となるマスの位置 (X,Y)(0X,YN1)(X,Y)\\ (0 ≦ X,Y ≦ N-1) と山の高さを表す整数 H(1HN)H\\ (1 ≦ H ≦ N) を指定します。
  • その後、全てのマスの Py,xP_{y,x}Py,x+max(0,HxXyY)P_{y,x} + max(0, H - |x-X| - |y-Y|) に書き換えます。

例として、8888 列の初期マス目であるマス目 QQ を考えます。
マス目 QQ に対して、 33 回の山型足し算 (X,Y,H)=(1,2,5),(5,1,3),(6,6,2)(X,Y,H) = (1,2,5),(5,1,3),(6,6,2) を行った後のマス目を以下の図に示します。

図 山型足し算の例 (空白のマスは 00 を表す。)

与えられたマス目 AA は、NNNN 列の初期マス目に対して、山型足し算を 10001000 回行って生成されたマス目です。
あなたの目的は、マス目 AA にできる限り近いマス目を生成する山型足し算の手順を求めることです。

具体的にはまず、NNNN 列の初期マス目であるマス目 BB を用意します。
次に、あなたはマス目 BB に対して山型足し算を最大 10001000 回まで行うことができます。
そして、マス目 AA とマス目 BB を比較したとき を最小化する山型足し算の手順を求めることを目的とします。
さらに、マス目 AA を生成するような山型足し算の手順が複数存在する場合には、山型足し算の回数を最小化することを目指してください。

採点方法

各テストケースの得点は以下のように計算される。

  • NN マス、横 NN マスの初期マス目に対し、あなたのプログラムが出力した山型足し算の手順に従い、マス目 BB を生成する。
  • まず、基本点として 点が得られる。
  • マス目 AA とマス目 BB に書かれている整数が全てのマスで一致した場合、山型足し算の回数を QQ とすると、ボーナス点として 1,000Q1,000-Q 点が得られる。

問題全体の得点は以下のように計算される。

  • テストケースの数は、以下の入力例 11 を含む 5050 ケースである。この 5050 ケースの点数の和がプログラムの点数となる。
  • 全テストケースのステータスに「AC」以外が存在する場合には、「example_01」を除く全てのテストケースの点数は0点となるので注意せよ。

制約

  • N=100N=100
  • 0Ai,j100,0000 ≦ A_{i,j} ≦ 100,000
  • マス目 AA は初期マス目に対して 10001000 回の山型足し算を行うことで生成されたマス目である。

入力

入力は以下の形式で与えられる。

A0,0A_{0,0} A0,1A_{0,1} ... A0,N1A_{0,N-1} A1,0A_{1,0} A1,1A_{1,1} ... A1,N1A_{1,N-1} : AN1,0A_{N-1,0} AN1,1A_{N-1,1} ... AN1,N1A_{N-1,N-1}

出力

マス目 AA にできる限り近いマス目 BB を生成する山型足し算の手順を以下の形式で出力せよ。

QQ X1X_1 Y1Y_1 H1H_1 X2X_2 Y2Y_2 H2H_2 : XQX_Q YQY_Q HQH_Q

11 行目には山型足し算の回数 Q(0Q1000)Q\\ (0≦Q≦1000) を出力せよ。
1+i(1iQ)1+i \\ (1 ≦ i ≦ Q) 行目には、ii 回目の山型足し算で用いるパラメータ (Xi,Yi,Hi)(X_i,Y_i,H_i) を表す整数をスペース区切りで出力せよ。

テストケースの生成方法

マス目 AA は初期マス目に対して、10001000 回の山型足し算を行うことで生成される。

各回の山型足し算で用いられるパラメータ (X,Y,H)(X,Y,H) についての制約

  • XX\[0,N-1\] の範囲で、一様乱数によってランダムに選ばれる。
  • YY\[0,N-1\] の範囲で、一様乱数によってランダムに選ばれる。
  • HH\[1,N\] の範囲で、一様乱数によってランダムに選ばれる。

入出力例1

入出力ファイルはこちらから(zip)

テストケース「example_01」が入出力例1に対応します。テストケース「example_01」も採点対象となります。