質問の意味:
間隔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 。 }