AGC037-B:RGB Balls

なんかだいたいこんな感じだけで通してしまったかも...。

問題

B - RGB Balls

考察と解法

 最小化すべきものは,条件を満たすようにN人に区間を割り当てたときの長さの総和である。本問の場合,区間としては(l,r]という半開区間を考えるべきだろう。さて,整数l_1,r_1,l_2,r_2があり,\max(l_1,l_2) \lt \min(r_1,r_2)を満たすとしよう。ここで,2人にl_1,l_2のどちらか,r_1,r_2のどちらかを割り当てることを考える。このとき,2人とt2つの区間の組み合わせは4通りあるが,どの場合でも2つの区間長さの和は

(\max(r_1,r_2)-\min(l_1,l_2))+2(\min(r_1,r_2)-\max(l_1,l_2))

と書ける。この例からわかるように,区間の長さの総和を小さくするには,区間の重なりが小さい方がよい。従って,ボールの割り当てを番号の小さいボールから順に決めるときに,以下の原則を満たすべきだと考えられる。

  1. ボールを1つも割り当てられていない人に,1つ目のボールを割り当てるタイミングはできるだけ遅い方がよい。
  2. ボールを1つでも割り当てられた人は,できるだけ早く3色のボールの割り当てを終えた方がよい。

 サンプル2 (BBRGRRGRGGRBBGB)を例に詳細を述べよう。(文字列全体で)1文字目のBは,N人のうち誰かに割り当て始めるしかないので,このボールの割り当て方はN通りある。2文字目のBは,1文字目のBを割り当てられた人以外に割り当てる必要があるので,割り当て方はN-1通りある。3文字目のRはどうだろうか?それ以前のBのうちどちらかを割り当てられている2人に割り当てるか,それ以外のN-2人に割り当てるかのどちらかであるが,実は前者の方が真によい(このことの証明は後に回すことにする)。従って,このRの割り当て方は2通りである。4文字目のGは現在B,Rを割り当てられた人に割り当てるのが最適であり,それは1通りである。この手続きを繰り返していくだけで答えが求まる。

 「この手続き」をもう少ししっかり述べよう。割り当てにおいて,各人に以下のような優先度を定めることができる。

  • 優先度2 (2色のボールを割り当てられている)
    タイプ2-1 Rがほしい
    タイプ2-2 Bがほしい
    タイプ2-3 Gがほしい
  • 優先度1 (1色のボールを割り当てられている)
    タイプ1-1 RかGがほしい
    タイプ1-2 RかBがほしい
    タイプ1-2 GかBがほしい
  • 優先度0 ボールがまだ1色も割り当てられていない

答えの初期値を1とし,i番目のボールを割り当てるときに優先度の高い順に該当する人が存在するかを調べ,いる場合はその人数だけ答えに乗算し,各タイプの該当者の人数調整を行う。これをボール3Nまで繰り返すことで答えが求まる。ここで,優先度1のうち存在するタイプが2種類の場合にどれに割り当てるべきか困りそうだが,この決め方をしているときに優先度1のうちの2種類以上のタイプが存在することはない。例えば,タイプ1-1とタイプ1-2は言い換えればBを割り当てられた人とGを割り当てられた人であるが,割り当てる過程でタイプ1-1が先に現れた場合,以後のGはタイプ1-1が存在しなくなるまでタイプ1-1に割り当てられることになる。逆の場合も同様なので,タイプ1-1とタイプ1-2は存在することができない。

 最後に,この解法の正当性を証明する。最小化すべきコストの計算方法を変えてみる。i番目のボールを割り当てられたときに得るコストは,割り当てる以前で優先度1,2のいずれかに属している人の数である。こうすると,優先度2の人に割り当てることができるならば,それより小さい優先度の人よりも先に割り当てることで,全体のコストを真に小さくできることは明らかだろう。

 次に,優先度0よりも1の方が先の方が真によいことを示そう。優先度0を先に割り当てた場合,優先度1に割り当てた場合に比べてその時点でのコストは同じだが,その後に損をすることになることを示そう。優先度1人をjとし,人jが持っているボールの色をBとする。今割り当てたい色をRとし,それをi番目とする。このR以後最初に現れるGの位置をr番目とする。上に述べた割り当て方では,このGは人jに割り当てられることに注意しよう。コストが優先度0である人j'を選び,Rをj'に割り当てたときに,rにあるGがどう割り当てられるかで場合分けする。

  • jr番目のGを割り当てることができる場合,iより後からrの間(i'番目とする)にRが存在することになる。jに割り当てるRをi番目に,j'に割り当てるRをi'番目にすることでコストを小さくできる。
  • jr番目のGを割り当てることができない場合,人ji番目にあるRを割り当てることで,人jr番目にあるGを割り当てることができるようになる。こうすることでj,j'にかかるコストをそれぞれ小さくできる。 RGBのは関係は入れ替えても同様の議論ができる。従って,優先度1の人に先に割り当てるべきであることがわかった。

 他のいかなる割り当て方よりもコストが真に小さくできるので,この数え方で不足はなく,正当性が言えた。

実装

Submission #6957966 - AtCoder Grand Contest 037
コンテスト中のものなので,上の解法と変数名の対応はめちゃくちゃ。