Submission #1323879

#TimeUsernameProblemLanguageResultExecution timeMemory
1323879gelastropodThe Xana coup (BOI21_xanadu)C++20
100 / 100
48 ms26240 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

vector<vector<int>> mem, adjlist;
vector<int> done;

int dp(int n, int p, int flag) {
    if (mem[n][flag] != -1) return mem[n][flag];
    int pa = done[n] ^ (flag & 1) ^ (flag >> 1), numf = 0, ans = (flag >> 1), mindiff = INT_MAX;
    if ((adjlist[n].size() == 1 && adjlist[n][0] == p) || adjlist[n].empty()) {
        if (pa) return mem[n][flag] = INT_MAX;
        return mem[n][flag] = (flag >> 1);
    }
    for (int i : adjlist[n]) {
        if (i == p) continue;
        int res1 = dp(i, n, (flag & 2) >> 1);
        int res2 = dp(i, n, ((flag & 2) >> 1) + 2);
        if (res2 < res1) numf++;
        ans += min(res1, res2);
        mindiff = min(mindiff, abs(res1 - res2));
    }
    if ((numf & 1) != pa) ans += mindiff;
    return mem[n][flag] = ans;
}

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int N, a, b; cin >> N;
    adjlist.resize(N, vector<int>());
    done.resize(N, 0);
    mem.resize(N, vector<int>(4, -1));
    for (int i = 0; i < N - 1; i++) {
        cin >> a >> b; a--, b--;
        adjlist[a].push_back(b);
        adjlist[b].push_back(a);
    }
    for (int i = 0; i < N; i++) {
        cin >> a;
        done[i] = a;
    }
    int res = min(dp(0, -1, 0), dp(0, -1, 2));
    if (res >= INT_MAX) cout << "impossible\n";
    else cout << res << '\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...