A - 球の詰め込み Editorial

Time Limit: 3 sec / Memory Limit: 1024 MB

問題文

サイズ L×L×LL × L × L の立方体型の容器がある。この容器に球を詰め込むゲームを行う。

容器内の点は直交座標系によって表され、容器の頂点の座標のうち一つは (0,0,0)(0, 0, 0) であり、その頂点から最も遠い頂点の座標は (L,L,L)(L, L, L) である。

詰め込める球は NN 個あり、球 11、球 22、…、球 NN と呼ばれる。球 ii の半径は RiR_i である。

これらから好きなだけ球を選び、それぞれ容器内の好きな整数座標に配置する (すなわち、球の中心がその整数座標となるように配置する)。

このとき、球が宙に浮いてもよいが、球が容器からはみ出たり球同士が重なったりしてはならない (球と容器、または球同士が接するのはよい)。

球の配置に対し、あなたの点数を以下の総和として計算する。

  • 基礎点: 球 ii には基礎点 PiP_i が定められており、球 ii を容器内に設置すると PiP_i 点を得られる。
  • ボーナス点: 近くに配置することが好ましい球のペアが MM 組与えられる。より具体的には、44 つの整数の組 (Ai,Bi,Ci,Di)(A_i, B_i, C_i, D_i)MM 個与えられる。これらはそれぞれ、球 AiA_i と球 BiB_i を中心間のユークリッド距離が CiC_i 以下となるように容器内に配置すると DiD_i 点を得られることを表す。(距離が CiC_i を超えるような配置が禁止されはしない。)

点数をできるだけ多く得られる球の配置を考えよ。最適解を求める必要はない。

制約

  • L=1000L = 1000
  • N=1000N = 1000
  • M=100000M = 100000
  • 1Ri2001 ≦ R_i ≦ 200
  • 1Pi800001 ≦ P_i ≦ 80000
  • 1Ai<BiN1 ≦ A_i < B_i ≦ N
  • 1Ci6001 ≦ C_i ≦ 600
  • 1Di800001 ≦ D_i ≦ 80000
  • 入力中の値はすべて整数である。

入力

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

LL NN MM
R1R_1 P1P_1
R2R_2 P2P_2
::
RNR_N PNP_N
A1A_1 B1B_1 C1C_1 D1D_1
A2A_2 B2B_2 C2C_2 D2D_2
::
AMA_M BMB_M CMC_M DMD_M

出力

配置における球 ii の中心座標を (Xi,Yi,Zi)(X_i, Y_i, Z_i) として、以下の形式で出力せよ。ただし、容器内に配置しない球の中心座標は (1,1,1)(-1, -1, -1) とせよ。

X1X_1 Y1Y_1 Z1Z_1
X2X_2 Y2Y_2 Z2Z_2
::
XNX_N YNY_N ZNZ_N

以下の場合、Wrong Answer と判定される。

  • 出力フォーマットが誤っている (Xi,Yi,ZiX_i, Y_i, Z_i のいずれかが整数でない場合を含む)。
  • 球が容器からはみ出ている。すなわち、容器内に配置した球 ii について、XiRiX_i - R_i, YiRiY_i - R_i, ZiRiZ_i - R_i のいずれかが 00 未満であるか、Xi+RiX_i + R_i, Yi+RiY_i + R_i, Zi+RiZ_i + R_i のいずれかが LL より大きい。
  • 球同士が重なっている。すなわち、容器内に配置した 22 つの球 ii, jj (i<j)(i < j) について、球 ii, jj の中心間のユークリッド距離が Ri+RjR_i + R_j より小さい。

入力生成

この項には必ずしも目を通す必要はない。

各球 ii のパラメータは以下のように決定される。

  • ii の半径 RiR_i は、11 以上 200200 以下の整数としてランダムに決定される。
  • 基礎点 PiP_i は、11 以上 max(1,Ri3/100)\max(1,R_i^3/100) 以下の整数としてランダムに決定される。

また、ii 件目のボーナス点のパラメータは以下のように決定される。

  • Ai,BiA_i, B_i は、11 以上 NN 以下の 22 つの整数としてランダムで決定される。ただし、等しい値が選ばれた場合は再抽選を行う。その後、Ai>BiA_i > B_i であれば AiA_iBiB_i の値を入れ替える。
  • CiC_i は、RAi+RBi+1R_{A_i} + R_{B_i} + 1 以上 RAi+RBi+200R_{A_i} + R_{B_i} + 200 以下の整数としてランダムに決定される。
  • DiD_i は、11 以上 2RAiRBi2R_{A_i}R_{B_i} 以下の整数としてランダムに決定される。

採点

単一のテストケースにおける点数は、問題文で述べたように基礎点とボーナス点の総和として算出される。

テストケースは 5050 ケース与えられ、すべてのテストケースの点数の総和がその提出の得点となる。

なお、テストケース example_01 以外で 11 ケースでも出力が Wrong Answer と判定された場合、example_01 以外のケースの点数はすべて 00 点となる。

サンプルコード (C++)

サンプルコード

このコードをそのまま提出しても構いません。



2025-04-02 (Wed)
13:08:57 +00:00