D - Moving Pieces on Line Editorial
by
satashun
まず,頂点の存在する領域が十分広いので maroon 君は隣り合う辺の色が異なる点の集合を \(\{t_1, t_2, \cdots, t_K\}\) にしたいと言い換えることができます.
コマの初期位置をソートしておきます.\(i\) 個のコマの最終地点が \(b_1, b_2, \cdots, b_N\) だとしましょう.すると,辺の色の組合せはコマの移動経路に依らず,\(a_i\) と \(b_i\) の位置関係だけで決まります.よって,最終地点を決めたときの最小値は \(\sum_{i=1}^n |a_i - b_i|\) です.また,明らかに \(b_1 \leq b_2 \leq \cdots \leq b_N\) としてよいです.
ではどのような \(b\) なら目的の色の組合せになるかについて考えます.多重集合 \(S\) に \(a_i, b_i\) を追加していって,要素ごとに \(S\) 内の個数が奇数であるものを集めて \(T\) を作ると,隣り合う辺の色が異なる点の集合が \(T\) となるような組合せになります.
つまり,全て \(\mod 2\) での操作とみなせるので,\(a\) と \(t\) の情報から \(b\) の中で奇数個あるものの集合は一意に決まり (これを \(\{c_1 < c_2 < \cdots < c_l\}\) とします),偶数個あるものはどこにあってもよい,ということになります.この奇数個あるべき場所の数が \(N\) より大きいと不可能です.
コストの最小化を考えます.\(a\) の中で \(c\) に残るものとの対応を決めます.すると,対応がつかずに残ったものは隣同士でペアにして同じ位置に存在するようにするのが良いです.ペアにできる条件として個数の parity をチェックしても良いですが,\(K\) が偶数なので今回は常に満たされます.
以上の考察から,dp[\(i\)][\(j\)][\(f\)] \(:= a_i\) まで見て \(c_j\) まで対応が決まっておりペア組で残っているものの個数が \(f\) のときのコストの最小値とおくと \(\mathrm{O}(N(N+K))\) で計算可能です.(ペアの間に対応が決まっている要素がある状態ではペアをずらして良いので \(f\) の情報は持たずに計算することもできます)
posted:
last update:
