ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

Tenka1 Programmer Contest (2018) D - Crossing

問題
提出コード
今のところ、500点の構築問題は自分と相性がいいみたいで全勝中です(数問しかやったことないですが)

解法

Sの個数をK、そしてS_iの個数を|S_i|とすると、
自動的に|S_i|=K-1となります。自分以外の集合と、ちょうど1つずつ共通部分が存在するからです。また、1Nそれぞれについて、どこか1組の集合のペアについて、共通部分を作成できます。
これは小さい方から実験していくと規則性が見えてきます。Kを決めたときに、Nは自動的に決まります。

  •  K = 2のとき
    これは、N=1のとき作成できます。

  • K=3のとき
    N=3となります。
    これはサンプルに存在する例です。

  • K=4のとき
    N=6となります。
    K=3のときのサンプルから、あらたにS_4を用意し、それまでのS_1S_3それぞれとS_4に、同じ数字を入れていけば完了です(例えば、S_1S_4に4を、S_2S_4に5を、S_3S_4に6をいれるとできます)。


これ以降も、K=xのとき、S_xを新たに用意し、すでにある集合それぞれと数字のペアを入れていけば条件を満たすことができます。この時、Nの条件は、
 N = \sum_{i=1}^{K-1} i
となります。
あとは、作成方法に従ってうまいことつくると、答えを導くことができます。次に追加する数字を記録しておき、forの二重ループを利用してやると賢い作成方法になるかと思います(Twitterで見かけたアイデアです、自分のコードはもう少し汚いです)。