牛オフの練習試合60E

 

 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])。
}

  

おすすめ

転載: www.cnblogs.com/033000-/p/12585635.html