どのように多くの回答が間違ってHDU - 3038(クラシック加重互いに素セット)

タイトル効果:長さの間隔は、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 
 } 

 

おすすめ

転載: www.cnblogs.com/Accepting/p/12643848.html