どのように多くの回答はWrong--加重互いに素、設定されています

トピックリンク

質問の意味:

間隔bの合計を与えるように頼まn回があり、和Q n回は矛盾した回のそこのカップルを与えられ、以前に与えられました。

例:

明らかに以前の2つと第三の競合である[1,10] = 30 [1,5] = 10、[6.10] = 10、、。

ソリューション:

和[i]は、Iに1を表し、存在する場合は[I、A]及び[I、B]限り[B、i]のように決定された - [ - 1、i]のがCに等しいです。

ルートノードである共通点を維持するためにばらばらのセットとそう

書式#include <iostreamの> 
書式#include <stdio.hに> 
する#include <math.h>の
 使用して 名前空間はstd; 
typedefの長い 長いLL。
const  int型 MAXN = 2E5 + 5 INT [MAXN] F。
INTのN、M。
int型の合計[MAXN]。/// 根节点到I的距离
INT検索(int型X)
{ 
    場合(X == [X] F)リターンX。
    INTのルート= 検索(F [X])。
    和[X] + = 和[X] [F]。
    戻り [X] = F ルート。
}
INT のmain()
{ 
    int型N、M。
    しながら(〜のscanf(" %d個の%のD "、&​​N、&M))
    { 
        ためint型私= 0 ; iが<= N; iが++)[I] = I、和F [I] = 0 ;
        int型 ANS = 0 ;
        ながら(M-- 
        { 
            int型、Bは、Sであり; 
            scanf関数(" %D%D%D "、&​​、&B、&S)。
            A - ;
            int型の FX = (a)の検索;
            int型年度=(b)の検索;
            もし(!FX = FY)
            { 
                [FY] F = FX。
                和[FY] =和[A] + S-和[B]。///    和[B] +和[FY] -sum [A] = sを
            }
             
            { 
                場合(!和[B] -sum [A] = S)++ ANS 
            } 
        } 
        のprintf(" %d個の\ n " 、ANS)。
    } 

    戻り 0 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/j666/p/11610131.html