KSDUPC 2024
コンテスト日時
2024/09/15 (Su) 14:00 - 15:40

H - 気まずいチーム

Ceylon
2
s
1024
MB
250

問題文

$N$ 人が競技プログラミングのオンサイトコンテストに参加します。
人 $i$ の強さは $A_i$ です。

いまから $N$ 人のチーム分けをします。
どの人もちょうど一つのチームに属さなければならず、どのチームにも少なくとも $2$ 人の人が属さなければなりません。
ここで、各チームの不満度を「チームに属している人の強さの最大値と最小値の差」と定義します。
つまり、チーム $T_k$ に属する人を $i_1, \ i_2, \dots, \ i_{|T_k|}$ とすると、このチームの不満度 $D_k$ は以下のように定義されます。

  • $D_k = \max ( A_{i_1}, A_{i_2}, \dots, A_{i_{|T_k|}} ) - \min (A_{i_1}, A_{i_2}, \dots, A_{i_{|T_k|}})$

各チームの不満度が $P$ 以下になるようにチーム分けをするとき、チーム数が最小になるようなチーム分けの方法を求めてください。

より厳密には、次の条件をすべて満たすチーム分けのうち、チーム数 $M$ が最小になるものを求めてください。

  • どの人もちょうど 1 つのチームに属する。
  • $T_1, T_2, \dots, T_M$ は $N$ 人を分割するチームであり、どのチーム $T_k$ も $|T_k| \geq 2$ を満たす。
  • 各チーム $T_k$ の不満度 $D_k$ が $P$ 以下、すなわち
    $D_k = \max (A_{i_1}, A_{i_2}, \dots, A_{i_{|T_k|}}) - \min (A_{i_1}, A_{i_2}, \dots, A_{i_{|T_k|}}) \leq P$

ただし、条件を満たしチーム数が最小となるチーム分けの方法が複数ある場合はそのうちの 1 つを出力してください。

出力形式は出力欄をご確認ください。

制約

  • $2 ≤ N ≤ 10$
  • $1 ≤ P ≤ 10^{9}$
  • $1 ≤ A_i ≤ 10^{9}$
  • 入力される数値は全て整数

入力

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

$N \ P$
$A_1 \ A_2 \ \dots \ A_N$

出力

$1$ 行目にチーム数 $M$ を出力してください。
$2$ 行目には、人 $i \ (1 \leq i \leq N)$ が所属するチームの番号を空白区切りで 1 行に出力してください。

チーム番号は、チームの不満度が小さい順に $1$ 以上 $M$ 以下の整数で表してください。
不満度が同じチームがある場合、そのチームの番号はどのように並べても構いません。
条件を満たすチーム分けの方法が存在しない場合は -1 を 1 行に出力してください。

ただし、条件を満たしチーム数が最小となるチーム分けの方法が複数ある場合はそのうちの 1 つを出力してください。

入力例 1
6 3 3 7 10 5 4 8
出力例 1
2 1 2 2 1 1 2

人 $1$, 人 $4$, 人 $5$ がチーム $1$ 、人 $2$, 人 $3$, 人 $6$ がチーム $2$ に属するとき、条件をすべて満たしておりチーム数が最小となります。
チーム番号は、チームの不満度が小さい順に整数で表すことに注意してください。

入力例 2
3 1 3 4 8
出力例 2
-1

条件を満たすチーム分けの方法は存在しません。

入力例 3
4 1 9 4 3 8
出力例 3
2 1 2 2 1

不満度が同じチームがある場合、そのチームの番号はどのように並べてもよいため、以下の出力も正解となります。

2
2 1 1 2
提出
C++23 (g++ 12.2.0)