Submission #961630

#TimeUsernameProblemLanguageResultExecution timeMemory
961630TAhmed33Nestabilnost (COI23_nestabilnost)C++98
41 / 100
150 ms197312 KiB
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5e3 + 25;
typedef long long ll;
const ll inf = 1e14;
ll a[MAXN], f[MAXN], n;
vector <int> adj[MAXN];
bool vis[MAXN];
vector <int> ind;
void fix (int pos, int par) {
	ind.push_back(pos);
	for (int i = 0; i < (int)adj[pos].size(); i++) {
		if (adj[pos][i] == par) {
			adj[pos].erase(adj[pos].begin() + i);
		}
	}
	vector <int> g; 
	for (auto j : adj[pos]) {
		fix(j, pos);
		if (a[pos] + 1 == a[j] || a[j] == 0) {
			g.push_back(j);
		}
	}
	adj[pos] = g;
}
vector <ll> dfs (int pos) {
	vector <ll> dp(n + 1);
	vis[pos] = 1;
	for (int i = 1; i <= a[pos]; i++) dp[i] = inf;
	for (auto j : adj[pos]) {
		auto z = dfs(j);
		ll mn = inf;
		for (int u = 1; u <= n; u++) {
			mn = min(mn, f[u] + z[u]);
		}
		for (ll i = a[pos] + 1; i <= n; i++) {
			if (a[pos] != i - 1 && a[j] == 0) {
				dp[i] += mn;
			} else {
				dp[i] += min(mn, z[i]);
			}
		}
	}
	return dp;
}
int main () {
	ios::sync_with_stdio(0); cin.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	for (int i = 1; i <= n; i++) cin >> f[i];
	for (int i = 1; i < n; i++) {
		int x, y; cin >> x >> y;
		adj[x].push_back(y);
		adj[y].push_back(x);
	}
	fix(1, -1);
	for (int i = 1; i <= n; i++) {
		for (auto j : adj[i]) {
			assert(a[j] == 0 || a[i] + 1 == a[j]); 
		}
	}
	ll sum = 0;
	for (auto i : ind) {
		if (!vis[i]) {
			auto z = dfs(i);
			ll mn = inf;
			for (int j = 1; j <= n; j++) {
				mn = min(mn, f[j] + z[j]);
			}
			sum += mn;
		}
	}
	cout << sum << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...