제출 #1134017

#제출 시각아이디문제언어결과실행 시간메모리
1134017heeheeheehaawThe Xana coup (BOI21_xanadu)C++20
100 / 100
87 ms26440 KiB
#include <bits/stdc++.h>

using namespace std;

int dp[100005][2][2];
int v[100005];
vector<int> adj[100005];
const int INF = 1e9;

void dfs(int nod, int parent)
{
    bool ok = false;
    for(auto it : adj[nod])
    {
        if(it != parent)
        {
            ok = true;
            dfs(it, nod);
        }
    }

    if(ok == false)
    {
        if(v[nod] == 1)
        {
            dp[nod][0][0] = INF;
            dp[nod][0][1] = 0;
            dp[nod][1][0] = 1;
            dp[nod][1][1] = INF;
        }
        else
        {
            dp[nod][0][0] = 0;
            dp[nod][0][1] = INF;
            dp[nod][1][0] = INF;
            dp[nod][1][1] = 1;
        }
    }
    else
    {
        dp[nod][0][0] = dp[nod][0][1] = dp[nod][1][0] = dp[nod][1][1] = INF;
        {
            int sum = 0, pr = v[nod];
            bool ok = true;
            priority_queue<int> pq;
            for(auto it : adj[nod])
            {
                if(it != parent)
                {
                    if(dp[it][0][0] != INF)
                    {
                        sum += dp[it][0][0];
                        if(dp[it][1][0] != INF)
                            pq.push(-(-dp[it][0][0] + dp[it][1][0]));
                    }
                    else
                    {
                        if(dp[it][1][0] != INF)
                        {
                            sum += dp[it][1][0];
                            pr = (pr + 1) % 2;
                        }
                        else
                        {
                            ok = false;
                        }
                    }
                }

            }

            dp[nod][0][pr] = sum;
            while(!pq.empty())
            {
                sum += -pq.top();
                pq.pop();
                pr = (pr + 1) % 2;
                dp[nod][0][pr] = min(dp[nod][0][pr], sum);
            }

            if(ok == false)
                dp[nod][0][0] = dp[nod][0][1] = INF;
        }

        {
            int sum = 0, pr = 1 - v[nod];
            bool ok = true;
            priority_queue<int> pq;
            for(auto it : adj[nod])
            {
                if(it != parent)
                {
                    if(dp[it][0][1] != INF)
                    {
                        sum += dp[it][0][1];
                        if(dp[it][1][1] != INF)
                            pq.push(-(-dp[it][0][1] + dp[it][1][1]));
                    }
                    else
                    {
                        if(dp[it][1][1] != INF)
                        {
                            sum += dp[it][1][1];
                            pr = (pr + 1) % 2;
                        }
                        else
                        {
                            ok = false;
                        }
                    }
                }

            }

            dp[nod][1][pr] = sum + 1;
            while(!pq.empty())
            {
                sum += -pq.top();
                pq.pop();
                pr = (pr + 1) % 2;
                dp[nod][1][pr] = min(dp[nod][1][pr], sum + 1);
            }

            if(ok == false)
                dp[nod][1][0] = dp[nod][1][1] = INF;
        }

    }
}

int main()
{
    int n;
    cin>>n;
    for(int i = 1; i < n; i++)
    {
        int a, b;
        cin>>a>>b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }

    for(int i = 1; i <= n; i++)
        cin>>v[i];

    dfs(1, 1);
    if(min(dp[1][1][0], dp[1][0][0]) != INF)
        cout<<min(dp[1][1][0], dp[1][0][0]);
    else
        cout<<"impossible";
    return 0;
}
#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...