タイトル効果:長さの間隔は、nは、Mのサブインターバルは、次の各セクションのワードフォーマットは、Zは、[X、Y]を表し、X、Yであり、およびzあります。現在の間隔と前回の間隔と競合した場合、現在のレンジと間違っを宣告され、質問:どのように多くの間隔や間違っ宣告されます。
この問題に対するソリューション:X、Y、Zを表すxがyにすべての数字を開始し、X-1は、区間内の(x-1、y]のから、我々は左のセクションにX-1缶は彼の左を発見することを言います。ポイント、左点の両方が(Lへ)が等しい場合間隔Yの右側にも、彼の左のエンドポイントを探している間、彼はに区間[L、y]は分割することである[L、X-1]及び[ X、Y]、我々は、間隔が等しくないかを決定し、それは、[X-1] + realtion wは== [W Y]です。
左の点が等しくない場合、我々はマージされます。
(A及びBは、xとyのルートです)
合併後:
次いで、重み変更 今ツリーBのルートノードであることを、予め定められた親ノードBがAであるが、BをX、パスは、2つを持っている必要があり、一方がX軸> A-> B、重量で他のX-> Y-> Bおよび[Y] W関係+の重みの合計である[X] + AB、Wの和
双方は、その結果、AB = W [A] = W [Y] -w [X] +関係ので、[X] + AB = [Y] W関係+ wは、等しくなければなりません。
コード:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONST INT N = 2E5 + 7 。 INT FA [N]。 INT W [N]。 INT検索(INT X){ 場合(X == FA [X])リターンX。 他{ INT C = (FA [X])を見つけます。 W [X] + = W [FA [X]]。 リターン FA [X] = C。 } } BOOL(団結int型のx、int型の Y、INTの関係){ int型 FX = FY =(X)を見つけます(y)を見つけます。 もし(!FX = FY){ FA [FY] = FX。 [FY] W = W [X] -w [Y] + 関係。 リターン 0 ; } 他{ 戻り関係= [Y] W! - [X] W。 } } int型のmain(){ int型N、M。 イオス:: sync_with_stdio(0 ); 一方、(CIN >> N >> m)が{ ため(INT iは= 0 ; I <= N; I ++ ){ FA [I] = I。 W [i]は =0 ; } INT ANS = 0 。 以下のために(INT iが= 1 ; I <= M; I ++ ){ int型のX、Y、Z。 CIN >> X >> Y >> Z。 X - ; もし ANS ++((x、y、z)を団結)。 } COUT << ANS << ENDL。 } 戻り 0 。 }