Codeforces - 書籍取引所(ハードバージョン)

トピックリンクhttp://codeforces.com/contest/1249/problem/B2  。セットの数に分け互いに素セットのアイデアは、コレクションの各サイズは、ラウンドを必要な日数です。

マップ[i]のデータを格納します。

フラグに[i]はi番目にアクセスするかどうかを示します。

MM [i]がセットのサイズに対応するi番目のセットを記録し、インデックスiは、値の対応するセットのi番目の根です。

直接現在のコレクションのルートに、各ノードの中継を更新するという考えに再帰的な方法をGETPARENT。

訪問アクセスのないセットので、従って、分析時間の複雑さは、精度がO(CN)であり、Cは定数です。mmはそれ以外の問題があるでしょう、それぞれの使用後に清掃することに留意する必要があります。

1の#include <ビット/ STDC ++ H>
 2  
3  / * 
4  *集查并
 5  * / 
6  
7  使って 名前空間STDを、
8  
9  静的 のconst  INT MAX = 200005 10  
11  INT マップ[MAX]。
12  ブールフラグ[MAX]。
13地図< INTINT > MM。
14  
15  INTのgetParent(INT X){
 16      であれば(!フラグ[X]){
 17          フラグ[X] =;
18          地図[X] = のgetParent(マップ[X])。
19      }
 20      リターンマップ[X]。
21  }
 22  
23  INT メイン(){
 24      のint Q。
25      のscanf(" %dの"、&Q)。
26      一方(q-- ){
 27          INT N。
28          のscanf(" %d個"、&N)
29          のためにint型 i = 1 ; iが<= N iが++ ){
 30             フラグ[I] = 31          }
 32  
33          // 構築物はセット
34          のint TMPを、
35          のためにint型 i = 1 ; iが<= N; iが++ ){
 36              のscanf(" %dの"、&マップ[I])。
37          }
 38  
39          // 解決
40          のためにint型 i = 1 ; iが<= N; iが++ ){
 41              のint親= のgetParent(I)。
42              mmの[親] ++;
43          }   
 44  
45          のためにint型 i = 1 ; iがn = <; iは++ ){
 46              であれば(I == 1 ){
 47                  のprintf(" %dの" 、MM [マップ[I])。
48              }
 49              {
 50                  のprintf(" %dの" 、MM [マップ[I])。
51              }
 52          }
 53          のprintf(" の\ n " );
54          mm.clear()。
55     }
 56      リターン 0 57 }

 

おすすめ

転載: www.cnblogs.com/sgatbl/p/11746984.html