ニュース配信
問題の意味
一人にメッセージを広める際に、小さなグループがそれぞれ出力に-1、ニュースを知っていたのn数 - - おそらくいくつかの小グループに分け、1で一人一人を与える場合は、メッセージを渡すの人の数n、どのように多くの人々はニュースを知っています。
入力
KIのm行に続く最初の行nおよびM(N、M <= 5 * 10 ^ 5)、次いでKI(0 <= KI <= n)の数、個々のKi QQグループの代表
出力
出力数n、i番目の代表、人は噂が愛を知った後、少数の人々まで送信することができます
例
入力7 5 3 2 5 4 0 2 1 2 1 1 2 7 6
出力4 4 4 4 1 2 2
トピックリンク
互いに素セットの質問
ルートノードの各ノードは、[]和のルートに保存され、クエリの各数値グループの総数N、互いに素なセットを使用してコレクションにメンバーを追加し続け、各セットの数を記録する - タイトルは、出力1と理解しました出力ルートノードSUM []。
ブリーフ互いに素-設定し、見た目になります
ACコード
書式#include <iostreamの> の#include <cstdioを> する#include <fstreamの> の#include <アルゴリズム> 書式#include <cmath> の#include <両端キュー> の#include <ベクトル> の#include <キュー> の#include < 文字列 > の#include <CStringの> #include <地図> の#include <スタック> の#include < 設定 > の#include <sstream提供> の#define IOS ios_base :: sync_with_stdio(0)。cin.tie(0)。 長い長いLL用 の#define 0x3f3f3f3f INF の#define MEM(X、Y)のmemset(X、Y、はsizeof(X)) の#define MAXN 5 100005 * 使用して 名前空間STD; int型 ; PAR [MAXN] // IのPAR [I]をルート int型 SUM [MAXN]; // iはSUM [i]が設定数 int型N-、M、K、 INT findr(INT X)// クエリルート { IF(PAR [X] == X) リターンX; 他 戻り PAR [X] = findr(PAR [X]を); } ボイドユナイト(INT X、INTY) { X = findr(X); // X、Yルートチェック Y = findr(Y)、 IF(X == Y)// 同じことなく、根管を リターン; PAR [Y] = X; // 場合は、すべての異なるが、Xに内蔵されたY、yはxの根であり、Y共感xは自由に本明細書に組み込まれることができる SUM [X] = SUM + [Y]; // Xとして援用Y、Xは集合Xの数に等しいです。セットの数を設定数+ Y } INT (メイン) { CIN >> N- M; のための(INT I = 1 ; I <= N; I ++は) { PAR [I] = I; SUM [I] = 1 ; } 一方(M-- ) { CIN >> K; int型、A、B IF(K> 0 ) { // 最初の数及び本比較の背面に CIN >> A; のための(INT I = 1 ; I <K; I ++ ) { CIN >> B、 ユナイト(A、B); } } } のための(int型私は= 1 ; I <= N; Iは++ ) { int型 X = findr(I); //ルート、出力部数のルートチェック COUTが<< SUM [X] << " " ; } COUT << ENDL; 戻り 0 ; }