DSUは、各回答一点をカウントするためにツリーを使用します
#include <ビット/ STDC ++ H> に#define forn(I、S、T)のための(INT I = S; I <(INT)T; I ++) の#define Fiの第一 の#define SE第二 の#define全て(x)はx )(.begin、x.end() の#define PF2(X、Y)のprintf( "%D%D \ n"、x、y)は の#define PF(X)のprintf( "%dの\ n"は、X) それぞれについて(X)(オートそれは:X)#defineするCOUTを<<それ<< ENDL。 #define PI対<整数、整数> の#define PB一back の#define SC(X)のscanf( "%dの"、およびX) の#define SC2(X、Y)のscanf( "%D%D"、およびX&Y) #PF(X)のprintf( "%D \ n"、x)の定義 に#define PF2(X、Y)のprintf( "%D%D \ n"、x、y)は の#define MEM(X)のmemset(Aを、X、はsizeof()) の#defineコピー(B)のmemcpy(A、B、はsizeof()) の#define SZ(X)(INT)X。 #define VIIベクトル<ペア<int型、int型>> サイズ[X] + =サイズ[Y]。 #define PIのペア<int型、int型> 名前空間stdを使用。 長い長いLLのtypedef。 CONST LL P = 1E9 + 7。 const int型MAXN = 1E5 + 5。 const int型MAXM = 2E5 + 5。 INTヘッド[MAXN]、版[MAXM]、NEX [MAXM]、TOT、N、K。 ボイドインラインAddEdge(int型のx、int型のY){ 版[++ TOT = Y、NEX [TOT =頭部[X]、ヘッド[X] = TOT。 } int型のサイズ[MAXN]、息子[MAXN]、CNT [MAXN]、VIS [MAXN]、DEP [MAXN]、AR [MAXN]。 [MAXN] [MAXN]和ANSちゃいます。 ボイドDFS(int型のx、int型PA){ サイズ[X] = 1。 [X] = DEP [PA] +1 DEP。 以下のために(INT iはヘッド[X]を=; iは、iは[i]がNEX =){ 版= INT yを[I]。 (Y == PA)を続ける場合。 DFS(Y、X)。 IF(!息子[X] ||サイズ[Y]>サイズ[息子[X]])息子[X] = Y。 } } ボイド追加(int型のx、int型PA、int型のOP){ 和[DEP [X] + = OP * AR [X]。 CNT [DEP [X] + = OP。 以下のために(INT iはヘッド[X]を=; iは、iは[i]がNEX =){ 版= INT yを[I]。 (Y == PA)を続ける場合。 (Y、X、OP)を追加します。 } } ボイドQRY(int型のx、int型PA、int型LCA){ int型D = K + 2 * DEP [LCA] -dep [X]。 IF(D> 0){ ANS [LCA] + =合計[D]。 ANS [LCA] + = CNT [D] * AR [X]。 } {(; I I = NEX [i]はiが[X]ヘッド= INT)のため のint = Y版[I]; (Y == PA)を続ける場合。 QRY(Y、X、LCA)。 } } ボイドDFS(int型のx、int型PA、ブールキープ){ (INT iは[x]はヘッド= Iは、NEXを= [I]; i)に対する{ DFS(Y、X、0); } int型、Y =版[I]; もし(Y == PA || Y ==息子[X])を続けます。 (息子[X])DFS(息子[x]は、X、1)、VIS [息子[X] = 1の場合。 以下のために(INT iはヘッド[X]を=; iは、iは[i]がNEX =){ 版= INT yを[I]。 もし(Y == PA || VIS [Y])続けます。 QRY(Y、X、X)。 追加(Y、X、1)。 } CNT [DEP [X]] ++; 和[DEP [X] + = AR [X]。 IF(息子[X])VIS [息子[X] = 0; IF(!キープは){ ため(INT I [x]はヘッド=; I; iがNEX [I] =){ int型、Y =版[I]; (Y == PA)を続ける場合。 追加(Y、X、-1)。 } CNT [DEP [X]] - 。 和[DEP [X]] - = AR [X]。 } } int型のmain(){ SC2(N、K)。 forn(I、1、N + 1) SC(AR [I])。 forn(I、1、N){ int型X、Y。 SC2(X、Y) AddEdge(X、Y) AddEdge(Y、X)。 } DFS(1,0)。 DFS(1,0,1)。 forn(I、1、N + 1) のprintf( "%のLLDの%のC"、ANS [i]は、 "\ n"は[I == N])。 }