Submission #1358864

#TimeUsernameProblemLanguageResultExecution timeMemory
1358864iamhereforfunThe Xana coup (BOI21_xanadu)C++20
100 / 100
39 ms25412 KiB
// Starcraft 2 enjoyer //

#include <bits/stdc++.h>

// #pragma GCC target("avx2")
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")

using namespace std;

#define LSOne(X) ((X) & -(X))
#define int long long

const int N = 1e5 + 5;
const int M = 15e5;
const int B = 18;
const long long K = 2;
const int LG = 60;
const long long INF = 1e18 + 5;
const int C = 26;
const int MOD = 1e9 + 7;

int n, dp[N][2][2], s[N];
vector<int> adj[N];

void upd(int &a, int b)
{
    if (a == -1)
        a = b;
    else
        a = min(a, b);
}

void dfs(int c, int p)
{
    int cur[2][2][2];
    memset(cur, -1, sizeof(cur));
    cur[0][0][0] = 0;
    cur[0][1][0] = 0;
    for (int i : adj[c])
    {
        if (i == p)
            continue;
        dfs(i, c);
        if (dp[i][0][0] != -1)
        {
            if (cur[0][0][0] != -1)
                upd(cur[1][0][0], cur[0][0][0] + dp[i][0][0]);
            if (cur[0][0][1] != -1)
                upd(cur[1][0][1], cur[0][0][1] + dp[i][0][0]);
        }
        if (dp[i][0][1] != -1)
        {
            if (cur[0][0][1] != -1)
                upd(cur[1][0][0], cur[0][0][1] + dp[i][0][1]);
            if (cur[0][0][0] != -1)
                upd(cur[1][0][1], cur[0][0][0] + dp[i][0][1]);
        }
        if (dp[i][1][0] != -1)
        {
            if (cur[0][1][0] != -1)
                upd(cur[1][1][0], cur[0][1][0] + dp[i][1][0]);
            if (cur[0][1][1] != -1)
                upd(cur[1][1][1], cur[0][1][1] + dp[i][1][0]);
        }
        if (dp[i][1][1] != -1)
        {
            if (cur[0][1][1] != -1)
                upd(cur[1][1][0], cur[0][1][1] + dp[i][1][1]);
            if (cur[0][1][0] != -1)
                upd(cur[1][1][1], cur[0][1][0] + dp[i][1][1]);
        }
        // cout << c << " " << i << "\n";
        for (int x = 0; x < 2; x++)
        {
            for (int y = 0; y < 2; y++)
            {
                cur[0][x][y] = cur[1][x][y];
                cur[1][x][y] = -1;
                // cout << cur[0][x][y] << " ";
            }
        }
        // cout << "\n";
    }
    int i = s[c];
    if (i)
    {
        dp[c][1][0] = cur[0][1][0];
        dp[c][1][1] = cur[0][0][1];
        dp[c][0][0] = cur[0][1][1];
        dp[c][0][1] = cur[0][0][0];
    }
    else
    {
        dp[c][1][0] = cur[0][1][1];
        dp[c][0][1] = cur[0][0][1];
        dp[c][0][0] = cur[0][1][0];
        dp[c][1][1] = cur[0][0][0];
    }
    if(dp[c][0][1] != -1) dp[c][0][1]++;
    if(dp[c][1][1] != -1) dp[c][1][1]++;
    if (c != p && adj[c].size() == 1)
    {
        dp[c][i][0] = 0;
        dp[c][!i][1] = 1;
    }
//     cout << dp[c][0][0] << " " << dp[c][0][1] << " " << dp[c][1][0] << " " << dp[c][1][1] << " " << c << "\n";
}

inline void solve()
{
    cin >> n;
    for (int x = 0; x < n - 1; x++)
    {
        int a, b;
        cin >> a >> b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    for (int x = 1; x <= n; x++)
    {
        cin >> s[x];
        s[x] = !s[x];
    }
    memset(dp, -1, sizeof(dp));
    dfs(1, 1);
    int i = min(dp[1][1][0], dp[1][1][1]);
    if (i == -1)
    {
        if(max(dp[1][1][0], dp[1][1][1]) == -1)
        {
            cout << "impossible\n";
        }
        else
        {
            cout << max(dp[1][1][0], dp[1][1][1]) << '\n';
        } 
    }
    else
        cout << i;
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    // cin >> t;
    for (int x = 1; x <= t; x++)
    {
        solve();
    }
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...