답안 #784493

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
784493 2023-07-16T07:28:39 Z blue Chase (CEOI17_chase) C++17
40 / 100
4000 ms 172896 KB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using vll = vector<ll>;
using vi = vector<int>;
#define sz(x) int(x.size())

const int mx = 100'000;
const int mxv = 100;

int n;
int m;

vll w(1+mx, 0);

vi edge[1+mx];

vi par(1 + mx, 0);

vll wsum(1+mx, 0);

void dfs(int u)
{
	for(int v : edge[u])
	{
		if(par[u] == v)
			continue;

		par[v] = u;
		dfs(v);
	}
}




ll up[1+mx][1+mxv];
ll dn[1+mx][1+mxv];

ll res = 0;

void dfs2(int u)
{
	for(int v : edge[u])
	{
		if(par[u] != v)
			dfs2(v);
	}




	//1. calculate up

	up[u][0] = 0;
	for(int k = 1; k <= m; k++)
		up[u][k] = wsum[u];

	for(int k = 0; k <= m; k++)
	{
		for(int v : edge[u])
		{
			if(par[u] == v)
				continue;

			up[u][k] = max(up[u][k], up[v][k]);
			if(k > 0)
				up[u][k] = max(up[u][k], up[v][k-1] + wsum[u] - w[v]);
		}
	}





	//2. calculate down

	dn[u][0] = 0;
	for(int k = 1; k <= m; k++)
		dn[u][k] = wsum[u] - w[par[u]];

	for(int k = 0; k <= m; k++)
	{
		for(int v : edge[u])
		{
			if(par[u] == v)
				continue;

			dn[u][k] = max(dn[u][k], dn[v][k]);

			if(k > 0)
				dn[u][k] = max(dn[u][k], dn[v][k-1] + wsum[u] - w[par[u]]);
		}
	}



	//3. update res

	//single element
	if(m >= 1)
		res = max(res, wsum[u]);

	//up path
	res = max(res, up[u][m]);

	//down path
	for(int v : edge[u])
	{
		if(par[u] != v)
		{
			res = max(res, dn[v][m]);
			if(m-1 >= 0)
				res = max(res, dn[v][m-1] + wsum[u]);
		}
	}

	//combination
	vll temp(1+m, -1'000'000'000'000'000'000LL);
	// for(int v : edge[u])
	// {
	// 	if(par[u] == v)
	// 		continue;

	// 	for(int j = 0; j <= m; j++)
	// 	{
	// 		res = max(res, temp0[m-j] + dn[v][j]);
	// 		res = max(res, temp1[m-j] + w[v] + dn[v][j]);
	// 	}

	// 	////////
	// 	for(int j = 0; j <= m; j++)
	// 	{
	// 		temp[j] = max(temp[j], up[v][j]);
	// 		if(j >= 1)
	// 		{
	// 			temp1[j] = max(temp1[j], up[v][j-1] + wsum[u] - w[v]);
	// 		}
	// 	}
	// }

	for(int v1 : edge[u])
	{
		if(par[u] == v1)
			continue;

		for(int v2 : edge[u])
		{
			if(par[u] == v2)
				continue;

			if(v1 == v2)
				continue;

			for(int j = 0; j <= m; j++)
			{
				res = max(res, (up[v1][j]) + (dn[v2][m-j]));
			}

			for(int j = 0; j <= m-1; j++)
			{
				res = max(res, (wsum[u]) + (up[v1][j] - w[v1]) + (dn[v2][m-1-j]));
			}
		}
	}
}





int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

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

	for(int e = 1; e <= n-1; e++)
	{
		int a, b;
		cin >> a >> b;
		edge[a].push_back(b);
		edge[b].push_back(a);
	}

	dfs(1);

	for(int i = 1; i <= n; i++)
		for(int j : edge[i])
			wsum[i] += w[j];

	for(int i = 1; i <= n; i++)
	{
		for(int j = 0; j <= m; j++)
		{
			up[i][j] = 0;
			dn[i][j] = 0;
		}
	}


	dfs2(1);


	// for(int i = 1; i <= n; i++)
	// {
	// 	for(int j = 0; j <= m; j++)
	// 		cerr << dn[i][j] << ' ';
	// 	cerr << '\n';
	// }

	cout << res << '\n';

}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4564 KB Output is correct
2 Correct 2 ms 4564 KB Output is correct
3 Correct 2 ms 4564 KB Output is correct
4 Correct 2 ms 4564 KB Output is correct
5 Correct 2 ms 4692 KB Output is correct
6 Correct 2 ms 4564 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4564 KB Output is correct
2 Correct 2 ms 4564 KB Output is correct
3 Correct 2 ms 4564 KB Output is correct
4 Correct 2 ms 4564 KB Output is correct
5 Correct 2 ms 4692 KB Output is correct
6 Correct 2 ms 4564 KB Output is correct
7 Correct 4 ms 6228 KB Output is correct
8 Correct 3 ms 6228 KB Output is correct
9 Correct 16 ms 6228 KB Output is correct
10 Correct 5 ms 6228 KB Output is correct
11 Correct 3 ms 6228 KB Output is correct
12 Correct 3 ms 6228 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 254 ms 172896 KB Output is correct
2 Correct 258 ms 172896 KB Output is correct
3 Execution timed out 4048 ms 166212 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4564 KB Output is correct
2 Correct 2 ms 4564 KB Output is correct
3 Correct 2 ms 4564 KB Output is correct
4 Correct 2 ms 4564 KB Output is correct
5 Correct 2 ms 4692 KB Output is correct
6 Correct 2 ms 4564 KB Output is correct
7 Correct 4 ms 6228 KB Output is correct
8 Correct 3 ms 6228 KB Output is correct
9 Correct 16 ms 6228 KB Output is correct
10 Correct 5 ms 6228 KB Output is correct
11 Correct 3 ms 6228 KB Output is correct
12 Correct 3 ms 6228 KB Output is correct
13 Correct 254 ms 172896 KB Output is correct
14 Correct 258 ms 172896 KB Output is correct
15 Execution timed out 4048 ms 166212 KB Time limit exceeded
16 Halted 0 ms 0 KB -