Submission #122220

#TimeUsernameProblemLanguageResultExecution timeMemory
122220samsChase (CEOI17_chase)C++14
100 / 100
763 ms254952 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int maxn = 1e5+10, maxk = 110;

int n, k;
ll dp[maxn][maxk], dp2[maxn][maxk], ant[maxn][maxk], ans, vis[maxn], vet[maxn];

vector <int> graph[maxn];

ll solve(int u, int f = 0)
{
	//if(c == 0) return dp[u][c] = 0LL;
	//if(dp[u][c] != -1) return dp[u][c];

	for(int v: graph[u])
	{	
		if(v == f) continue;
		solve(v, u);

		for(int i = 1 ; i <= k ; ++i)
		{
			ll val = max(dp[v][i-1] + vis[v] - vet[u], dp[v][i]);
		
			if(val > dp[u][i]) dp2[u][i] = dp[u][i], dp[u][i] = val;
			else if(val > dp2[u][i]) dp2[u][i] = val;
		}
	}
	
	//return dp[u][c];
}

void rotate(int u, int f = 0)
{
	for(int i = 1 ; i <= k ; ++i)
	{
		ans = max({ans, dp[u][i], dp[u][i-1] + vis[u]});
	}

	for(int v: graph[u])
	{
		if(v == f) continue;

		for(int i = 1 ; i <= k ; ++i)
		{
			ant[u][i] = dp[u][i];
			
			ll val = max(dp[v][i], dp[v][i-1] + vis[v] - vet[u]);

			if(val == dp[u][i])
			{
				dp[u][i] = dp2[u][i];
			}
		}

		for(int i = 1 ; i <= k ; ++i)
		{
			ll val = max(dp[u][i], dp[u][i-1] + vis[u] - vet[v]);

			if(val > dp[v][i]) dp2[v][i] = dp[v][i], dp[v][i] = val;
			else if(val > dp2[v][i]) dp2[v][i] = val;
		}

		rotate(v, u);

		for(int i = 1 ; i <= k ; ++i) dp[u][i] = ant[u][i];
	}
}

int main()
{
	cin >> n >> k;

	for(int i = 1 ; i <= n ; ++i) cin >> vet[i];

	for(int i = 1 ; i < n ; ++i)
	{
		int u, v;
		cin >> u >> v;

		graph[u].push_back(v);
		graph[v].push_back(u);
	}

	for(int i = 1 ; i <= n ; ++i)
	{
		for(int v: graph[i])
		{
			vis[i] += vet[v];
		}
	}

	//memset(dp, -1, sizeof dp);

	solve(1);
	rotate(1);

	cout << ans << '\n';
}

Compilation message (stderr)

chase.cpp: In function 'll solve(int, int)':
chase.cpp:33:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...