[Bzoj3829] [Poi2014] FarmCraft_木DP

FarmCraft

トピックへのリンクhttps://lydsy.com/JudgeOnline/problem.php?id=3829

データ範囲:わずか。


問題の解決策

各側は二回しか行かなければならないので、私たちは、その後出てサブツリーへのパスを入力する必要がありますので、もはや行くことはできません。

このプロパティで、私たちは$のf_i $ $ I $の中に表される状態を設計答えるためにサブツリーのルートです。

転送は、我々は彼の息子たちは息子ができたの前でそれをよりよく判断暴力の一種であることを見つけるために必要がある場合。

コード

#include <ビット/ STDC ++。H>

#define N 1000010 

名前空間stdを使用。

するchar * P1、P2 *、BUF [100000]。

#define NC()(P1、P2 == &&(P2 =(P1 = BUF)+関数fread(BUF、1、100000、STDIN)、P1 == P2)EOF:* P1 ++)

int型RD(){
	INT X = 0、F = 1。
	チャーC = NC()。
	一方、(C <48){
		もし(C == ' - ')
			F = -1。
		C = NC()。
	}
	一方、(C> 47){
		X =(((X << 2)+ X)<< 1)+(C ^ 48)、C = NC()。
	}
	x * Fを返します。
}

[N << 1]、NXT [N << 1]、TOTにINTヘッド[N]、。

インラインボイド追加(int型のx、int型のY){
	【TOT ++] = Yであり;
	NXT [TOT =頭部[X]。
	ヘッド[X] = TOT。
}

INT C [N]。

ボイドDFS(int型P、int型のFA){
	C [P] = 1。
	用(INT I =ヘッド[P]; I; I = NXT [I]){
		IF([I]に!= FA){
			DFS([i]は、pまで)。
			S [P] + = S [I]]。
		}
	}
}

int型T [N]、F [N]。

構造体ノード{
	int型のval、ID;
} Q [N]。

//インラインブールCMP(CONSTノードと、ノードのconst&B){
// a.val <b.val返します。
//}

インラインブールCMP(CONSTノードと、ノードのconst&B){
	MAX(a.val、SZ [a.id] * 2 + b.val)<MAX(b.val、SZ [b.id] * 2 + a.val)を返します。
}

ボイドDFS1(int型P、int型のFA){
	F [P] = tの[P]。
	用(INT I =ヘッド[P]; I; I = NXT [I]){
		IF([I]に!= FA){
			([i]は、pまで)DFS1。
		}
	}
	int型CNT = 0;
	用(INT I =ヘッド[P]; I; I = NXT [I]){
		IF([I]に!= FA){
			Q [++ CNT] =(ノード){[する[I]、[I]乃至F}。
		}
	}
	ソート(Q + 1、Q + CNT + 1、CMP)。
	int型の合計= 0;
	以下のために(INT i = 1; iは= CNTを<; iは++){
		F [P] = MAX(F [P]、F [Q [I] .ID] +和+ 1)。
		和+ = SZ [Q [I] .ID] * 2。
	}
}

{int型のmain()
	INT、N = RD()。
	// INT M = T [1]。
	以下のために{(INT i = 1; iが++; iが<= N)
		T [I] = RD()。
	}
	// T [1] = 0;
	以下のために(INT i = 1; iがn <; iは++){
		INT X = RD()、Y = RD()。
		追加し、(X、Y)を追加(Y、X)。
	}
	DFS(1、1)。
	DFS1(1、1)。
	{//ために(iは++; iがn = <I = 1 INT)
	//のprintf( "%dの"、F [I])。
	//}
	//プット( "");
	COUT << MAX([1]、(N F  -  1)* 2 + T [1])<< ENDL。
	0を返します。
}

 

おすすめ

転載: www.cnblogs.com/ShuraK/p/11773693.html