より簡単な類題
「Size が \(2N\) の multiset \(c\) が与えられる. この中からペアを \(N\) 個作る. ただし,異なる元同士をペアにしなければならない.」 という問題を考える. これが可能である必要十分条件は,
必要性は,もしある元 \(x\) の個数が \(N\) 個より多ければ, \(x\) 同士でペアにしないといけないので不可能,ということから分かる. 十分性は, 一番多い元 \(x\) と,\(y \in c\) \*1{
「Size が \(2N\) の multiset \(c\) が与えられる. この中からペアを \(N\) 個作る. ただし,異なる元同士をペアにしなければならない.」 という問題を考える. これが可能である必要十分条件は,
必要性は,もしある元 \(x\) の個数が \(N\) 個より多ければ, \(x\) 同士でペアにしないといけないので不可能,ということから分かる. 十分性は, 一番多い元 \(x\) と,\(y \in c\) \*1{
*1:y \neq x)\) をペアにしていけば, \(c' = c - \{\ x,y\ \}\) もまた \(P(c')\) を満たすため. 注意として, \(cx = N\) となる異なる\(x\) は,高々 2つになる.
本問も同様に解ける. Multiset \(a,b\) の union \(c\) を考える. \(c\) において一番多い元の個数が \(N\) を超える場合は不可能. 逆に,\(N\) 個以下の場合は可能.
\(c\) において一番多い元を \(x\) とおく. \(x\) の個数が \(Size(a)\) 以下であると仮定する. 帰納法で,ペアのリストが作れることを示す.
\( Size(a) = Size(b) = 1\) のときは明らか. \( Size(a) = Size(b) > 1\) とする. \(x \in a\) のとき, 仮定から,ある \(y \in b\) が存在して \(x \neq y\). よって, \(a\) から \(x\) を取り除き, \(b\) から \(y\) を取り除き, \(c = a \cup b\) で取り直す. 新しい \(a,b,c\) に対しても, \(x\) の個数が \(Size(a)\) 以下となる. \(x \in b\) の場合も同様.
Multiset のクラスを独自に作った. \(c\) から一番多い元をとってくるときと, \(c\) から削除する操作をしたいため.
mlty : 元 -> multiplicity だけでなく, p : multiplicity -> 元 を用意することで実装した.
c++ の multiset は,erase するときに iterator を指定しないと, 指定した元が全て消えてしまう.
使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"