제출 #394791

#제출 시각아이디문제언어결과실행 시간메모리
394791Nima_NaderiChase (CEOI17_chase)C++14
100 / 100
806 ms169052 KiB
//In the name of God
//#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll MXN = 1e5 + 5;
const ll MXM = 100 + 5;
ll n, k, ans;
ll dp[MXM][MXN], pd[MXM][MXN], fp[MXM];
ll P[MXN], N[MXN], F[MXN];
vector<ll> adj[MXN];
void DFS(ll u, ll par){
	pd[1][u] = N[u];
	F[u] = N[u] - P[par];
	for(auto v : adj[u]) if(v != par) DFS(v, u);
	for(auto v : adj[u]){
		if(v != par){
			memset(fp, 0, sizeof fp);
			for(int j = 0; j <= k; j ++){
				fp[j] = max(fp[j], pd[j][v]);
				if(j) fp[j] = max(fp[j], pd[j - 1][v] + N[u] - P[v]);
			}
			for(int j = 0; j <= k; j ++) ans = max(ans, fp[j] + dp[k - j][u]);
			for(int j = 0; j <= k; j ++) pd[j][u] = max(pd[j][u], fp[j]);
			for(int j = 0; j <= k; j ++) dp[j][u] = max(dp[j][u], dp[j][v]);
		}
	}
	if(adj[u].size() > 1){
		reverse(adj[u].begin(), adj[u].end());
		for(int j = 0; j <= k; j ++) dp[j][u] = 0;
		for(auto v : adj[u]){
			if(v != par){
				memset(fp, 0, sizeof fp);
				for(int j = 0; j <= k; j ++){
					fp[j] = max(fp[j], pd[j][v]);
					if(j) fp[j] = max(fp[j], pd[j - 1][v] + N[u] - P[v]);
				}
				for(int j = 0; j <= k; j ++) ans = max(ans, fp[j] + dp[k - j][u]);
				for(int j = 0; j <= k; j ++) dp[j][u] = max(dp[j][u], dp[j][v]);
			}
		}
	}
	for(int j = 0; j < k; j ++){
		ans = max(ans, N[u] + dp[j][u]);
	}
	for(auto v : adj[u]){
		if(v != par){
			for(int j = 1; j <= k; j ++){
				dp[j][u] = max(dp[j][u], dp[j - 1][v] + F[u]);
			}
		}
	}
	dp[1][u] = max(dp[1][u], F[u]);
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);
	cin >> n >> k;
	for(int i = 1; i <= n; i ++) cin >> P[i];
	for(int i = 1; i < n; i ++){
		ll u, v; cin >> u >> v;
		adj[u].push_back(v), adj[v].push_back(u);
		N[u] += P[v], N[v] += P[u];
	}
	DFS(1, 0);
	for(int i = 1; i <= n; i ++) ans = max(ans, dp[k][i]);
	for(int i = 1; i <= n; i ++) ans = max(ans, pd[k][i]);
	cout << ans << '\n';
	return 0;
}
//! N.N
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...