답안 #848526

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
848526 2023-09-12T20:31:45 Z qthang2k11 Chase (CEOI17_chase) C++17
20 / 100
382 ms 524288 KB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int N = 1e5 + 5;

template<class X, class Y>
inline void maxi(X &x, Y y) {
	if (x < y) x = y;
}

vector<int> g[N];
int n, k, a[N];
ll s[N];

ll ans = 0, INF;

struct Node {
	ll val[101][2];

	Node() {
		memset(val, -63, sizeof val);
	}

	void maxi_(const Node &other) {
		for (int i = 0; i <= k; i++)
			for (int j = 0; j < 2; j++)
				maxi(val[i][j], other.val[i][j]);
	}

	void deal(const Node &other, const int &x, const int &y) { // update from y to x
		for (int i = 0; i <= k; i++) {
			for (int j = 0; j < 2; j++) {
				ll cur = other.val[i][j];
				if (i < k) {
					if (j) maxi(val[i + 1][1], cur + s[x] - a[y]);
					else maxi(val[i + 1][1], cur + s[x] - a[y]);
				}
				maxi(val[i][0], cur);
			}
		}
	}

	Node deal_(const int &x, const int &y) { // update from y to x
		Node ans;
		for (int i = 0; i <= k; i++) {
			for (int j = 0; j < 2; j++) {
				ll cur = val[i][j];
				if (i < k) {
					if (j) maxi(ans.val[i + 1][1], cur + s[x] - a[y]);
					else maxi(ans.val[i + 1][1], cur + s[x] - a[y]);
				}
				maxi(ans.val[i][0], cur);
			}
		}
		return ans;
	}

	ll res() const {
		ll ans = 0;
		for (int i = 0; i <= k; i++)
			for (int j = 0; j < 2; j++)
				maxi(ans, val[i][j]);
		return ans;
	}
};

vector<Node> suf[N];
Node dp[N];

void dfs_init(int x, int p) {
	for (int i = g[x].size() - 1; i >= 0; i--) {
		int y = g[x][i];
		if (y != p) continue;
		swap(g[x][i], g[x].back());
		g[x].pop_back();
	}
	for (int y: g[x]) dfs_init(y, x);
}

void dfs(int x) {
	suf[x].resize(g[x].size());
	for (int y: g[x]) dfs(y);
	for (int o = g[x].size(), i = o - 1; i >= 0; i--) {
		int y = g[x][i];
		auto &p = suf[x][i];
		if (i < o - 1) p.maxi_(suf[x][i + 1]);
		p.deal(dp[y], x, y);
	}
	if (!g[x].empty()) dp[x] = suf[x][0];
	// else {
		maxi(dp[x].val[0][0], 0);
		if (k > 0) maxi(dp[x].val[1][1], s[x]);
	// }
	maxi(ans, dp[x].res());
}

Node pref;
void dfs_reroot(int x, Node down) {
	maxi(down.val[0][0], 0);
	if (k > 0) maxi(down.val[1][1], s[x]);
	maxi(ans, down.res());
	pref = Node();
	for (int i = 0, o = g[x].size(); i < o; i++) {
		int y = g[x][i];
		Node cur = down;
		if (i > 0) cur.maxi_(pref);
		if (i + 1 < o) cur.maxi_(suf[x][i + 1]);
		dfs_reroot(y, cur.deal_(y, x));
		pref.deal(dp[y], x, y);
	}
}

int32_t main() {
	cin.tie(0)->sync_with_stdio(0); 
	cin >> n >> k;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	for (int i = 1; i < n; i++) {
		int x, y;
		cin >> x >> y;
		g[x].emplace_back(y);
		g[y].emplace_back(x);
	}
	for (int x = 1; x <= n; x++) {
		for (int y: g[x])
			s[x] += a[y];
	}
	dfs_init(1, 0);
	dfs(1);
	dfs_reroot(1, Node());
	cout << ans;
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 164444 KB Output is correct
2 Correct 20 ms 164624 KB Output is correct
3 Correct 23 ms 164408 KB Output is correct
4 Correct 20 ms 164444 KB Output is correct
5 Correct 20 ms 164444 KB Output is correct
6 Correct 21 ms 164368 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 164444 KB Output is correct
2 Correct 20 ms 164624 KB Output is correct
3 Correct 23 ms 164408 KB Output is correct
4 Correct 20 ms 164444 KB Output is correct
5 Correct 20 ms 164444 KB Output is correct
6 Correct 21 ms 164368 KB Output is correct
7 Correct 26 ms 168284 KB Output is correct
8 Correct 24 ms 168280 KB Output is correct
9 Correct 22 ms 165976 KB Output is correct
10 Correct 24 ms 166096 KB Output is correct
11 Correct 22 ms 165972 KB Output is correct
12 Incorrect 23 ms 165980 KB Output isn't correct
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 382 ms 524288 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 164444 KB Output is correct
2 Correct 20 ms 164624 KB Output is correct
3 Correct 23 ms 164408 KB Output is correct
4 Correct 20 ms 164444 KB Output is correct
5 Correct 20 ms 164444 KB Output is correct
6 Correct 21 ms 164368 KB Output is correct
7 Correct 26 ms 168284 KB Output is correct
8 Correct 24 ms 168280 KB Output is correct
9 Correct 22 ms 165976 KB Output is correct
10 Correct 24 ms 166096 KB Output is correct
11 Correct 22 ms 165972 KB Output is correct
12 Incorrect 23 ms 165980 KB Output isn't correct
13 Halted 0 ms 0 KB -