1〜nは、数nは、次にセットとして独自の初期数の各操作m回。
3つの動作があります
。1つのPQ:Pは、ここで、Qのセットに組み込まれるように設定されています
2 PQ:P-Pのセットのうち、Qのセットに
3 P:要素数と出力の集合の要素とp
サンプル入力
5 7
1 1 2
2 3 4
1 3 5
3 4
2 4 1
3 4
3 3
出力例
3 12
3 7
2 8
書式#include <iostreamの> の#include <cstdioを> する#include <文字列> の#include <CStringの> の#include <cmath> の#include <アルゴリズム> 書式#include <キュー> の#include <マップ> 書式#include <設定> 書式#include <スタック> #include <ベクトル> の#define Twhile()T INT; scanf関数( "%のD"、&T);一方(T--) の#define CLC(B)のmemset(A、B、はsizeof()) の#define <;(I ++ B I iは=)用のフォーラム(I、B) (; B; i-- I iは=)用の#define FORS(I、B)> の#define fora2(iはI <= B; I ++)(iは=ため、B) = B; i--)I;(iは=ための#define fors2(I、B)> )-1.0(ACOSの#define PI #define EPS 1E-6 の#define INF 0x3f3f3f3f のtypedef長い長LL。 長い長いLDのtypedef。 名前空間stdを使用。 MAXN = 100000 + INT CONST 11; 地図<整数、整数>ミリアンペア; INT COU [MAXN]、SUM [MAXN]; INT FA [MAXN]; int型N-、M、 ボイドのinit() { ma.clear(); INT I; fora2(I ,. 1、N-) { FA [I] = I; // i番目のI点父 COU [I] = 1; //設定i番目の数1 SUM [I] = I; // iは、i番目の和に設定 i番目に属する点の// i番目のセット;ミリアンペア[I] = I } } int型Aのfind_xx(INT X) { IF(FA == X [X])リターンXを; ;リターンFA [X]はのfind_xx(FA [X])= } int型のmain() { int型kcase = 0; ながら(〜scanfの( "%D%D"、およびN-、&M)) { INITを(); しばらく( M--) { 首[FY] +首[FX] OPのINT; scanfの( "%のD"、&OP)、 IF(OP == 3)//要素の数と出力セットの要素とp { int型X; scanfの( "%のD"、X&); INT FX = Aのfind_xx(ミリアンペア[X]); のprintf( "%D%D \ N-"、COU [FX]、SUM [FX]); 続行; } int型のX、Y、 scanfの( "%Dの%のD"、およびX 、&Y); INT = FX Aのfind_xx(ミリアンペア[X])のfind_xx FY =(ミリアンペア[Y]); IF(FX == FY)続行; 。。IF(OP == 1)1つのPQ //:ここで、p Qセットの組み合わせセット { FY合成//分岐FXおよび通信 FA [FX] = FY; SUM [FY] = SUM + [FX]; //クリアFX COU [FX] = 0; SUM [FX] = 0; 続行; } Xミリアンペア[x]のうちから//セット // 2 PQ:セットからPアウトP、にQのセット SUM [FX] - = X; COU [FX] - ; //セットXミリアンペア[Y]に [X] =ミリアンペア[Y]ミリアンペア; COU [FY] ++; SUM [FY ] = X +; } } 0を返します; }