Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstdlib>
- #include <vector>
- #include <set>
- #include <map>
- #include <cassert>
- #include <ctime>
- #include <cmath>
- #include <string>
- #include <cstring>
- #include <queue>
- using namespace std;
- #define f first
- #define s second
- #define mp make_pair
- #define pb push_back
- #define pii pair<int, int>
- #define vi vector<int>
- #define all(v) (v).begin(), (v).end()
- #define forit(it,v) for (typeof(v.begin()) it = v.begin(); it != v.end(); ++it)
- #define f0(a) memset(a, 0, sizeof(a))
- const int maxn = 200000;
- long long ans[maxn];
- int n, k[maxn];
- vi g[maxn];
- void Dfs(int v, int parent) {
- vector<int> vec;
- ans[v] = 0;
- forit(it, g[v]) {
- int to = *it;
- if (to != parent) {
- k[to]--;
- Dfs(to, v);
- vec.pb(ans[to]);
- }
- }
- sort(all(vec));
- reverse(all(vec));
- long long sum = vec.size();
- for (int i = 0; k[v] > 0 && i < vec.size(); ++i) {
- ans[v] += vec[i] + 1;
- sum--;
- k[v]--;
- }
- forit(it, g[v]) {
- int to = *it;
- if (to != parent)
- sum += k[to];
- }
- if (v == 5) cerr << sum << endl;
- long long tmp = min(1ll * k[v], sum);
- ans[v] += 2*tmp;
- k[v] -= tmp;
- }
- int main() {
- #ifdef LOCAL
- freopen("in", "r", stdin);
- freopen("out", "w", stdout);
- #endif
- scanf("%d", &n);
- for (int i = 1; i <= n; ++i)
- scanf("%d", &k[i]);
- for (int i = 0; i < n - 1; ++i) {
- int u, v;
- scanf("%d%d", &u, &v);
- g[u].pb(v);
- g[v].pb(u);
- }
- int start;
- scanf("%d", &start);
- Dfs(start, -1);
- cout << ans[start] << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment