Submission #293157

#TimeUsernameProblemLanguageResultExecution timeMemory
293157shivensinha4Chase (CEOI17_chase)C++17
40 / 100
4082 ms89592 KiB
#include <bits/stdc++.h> 
using namespace std; 
#define for_(i, s, e) for (int i = s; i < (int) e; i++)
#define for__(i, s, e) for (ll i = s; i < e; i++)
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> ii;
#define endl '\n'

const int MXN = 1e5, MXV = 100;
int n, v;
ll dp[MXN+1][MXV+1];
ll nums[MXN+1];
vi adj[MXN+1];
ll ans = 0;

void init(int p, int parent) {
	for (int i: adj[p]) if (i != parent) init(i, p);
	for_(ct, 0, v+1) {
		ll s = 0, take = 0, noTake = 0;
		for (int i: adj[p]) if (i != parent) {
			s += nums[i];
			if (ct) take = max(take, dp[i][ct-1]);
			noTake = max(noTake, dp[i][ct]);
		}
		dp[p][ct] = noTake;
		if (ct) dp[p][ct] = max(dp[p][ct], s+take);
	}
}

vector<ll> prefMax(vector<ll> k) {
	for_(i, 1, k.size()) k[i] = max(k[i], k[i-1]);
	return k;
}

vector<ll> sufMax(vector<ll> k) {
	for (int i = k.size()-2; i >= 0; i--) k[i] = max(k[i], k[i+1]);
	return k;
}

void reroot(int p, int parent, ll p0, ll p1) {
	//cout << "! " << p << " " << parent << " " << p0 << " " << p1 << endl;
	int ct = adj[p].size();
	vector<ll> take(ct), noTake(ct), takePref, takeSuf, noTakePref, noTakeSuf;
	ll s = 0;
	for_(i, 0, ct) {
		if (adj[p][i] == parent) {
			take[i] = p1; noTake[i] = p0;
		} else {
			take[i] = dp[adj[p][i]][v-1]; noTake[i] = dp[adj[p][i]][v];
		}
		s += nums[adj[p][i]];
	}
	
	takePref = prefMax(take); noTakePref = prefMax(noTake);
	takeSuf = sufMax(take); noTakeSuf = sufMax(noTake);
	//cout << p << " " << takeSuf[0] + s << " " << noTakeSuf[0] << endl;
	ans = max({ans, takeSuf[0] + s, noTakeSuf[0]});
	
	for_(i, 0, ct) {
		if (adj[p][i] == parent) continue;
		//reroot(adj[p][i], p, max(i > 0 ? noTakePref[i-1] : 0, i < ct-1 ? noTakeSuf[i+1] : 0), max(i > 0 ? takePref[i-1] : 0, i < ct-1 ? takeSuf[i+1] : 0) + s - nums[adj[p][i]]);
	}
}

int main() {
	#ifdef shiven
	freopen("test.in", "r", stdin);
	#endif
	
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	
	cin >> n >> v;
	for_(i, 0, n) cin >> nums[i];
	for_(i, 0, n-1) {
		int a, b; cin >> a >> b;
		a -= 1; b -= 1;
		adj[a].push_back(b); adj[b].push_back(a);
	}
	
	if (v == 0) {
		cout << 0 << endl;
		return 0;
	}
	
	for_(i, 0, n) {
		init(i, i);
		reroot(i, i, 0, 0);
	}
	
	cout << ans << endl;

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...