Submission #409750

#TimeUsernameProblemLanguageResultExecution timeMemory
409750shahriarkhanThe Xana coup (BOI21_xanadu)C++14
100 / 100
100 ms21568 KiB
#include<bits/stdc++.h>
using namespace std ;

const int INF = 1e9 , mx = 1e5 + 5 ;

vector<int> adj[mx] ;

long long dp[mx][2][2] ;

int col[mx] ;

void calc(int s , int p)
{
    long long add1 = INF , add2 = INF , cnt1 = 0 , cnt2 = 0 , tot1 = 0 , tot2 = 0 ;
    for(int t : adj[s])
    {
        if(t==p) continue ;
        calc(t,s) ;
        if(dp[t][0][1]<dp[t][0][0])
        {
            ++cnt1 ;
            tot1 += dp[t][0][1] ;
            add1 = min(add1,dp[t][0][0] - dp[t][0][1]) ;
        }
        else
        {
            tot1 += dp[t][0][0] ;
            add1 = min(add1,dp[t][0][1] - dp[t][0][0]) ;
        }
        if(dp[t][1][1]<dp[t][1][0])
        {
            ++cnt2 ;
            tot2 += dp[t][1][1] ;
            add2 = min(add2,dp[t][1][0] - dp[t][1][1]) ;
        }
        else
        {
            tot2 += dp[t][1][0] ;
            add2 = min(add2,dp[t][1][1] - dp[t][1][0]) ;
        }
    }
    dp[s][1][0] = tot1 ;
    dp[s][1][1] = tot2 + 1 ;
    dp[s][0][0] = tot1 ;
    dp[s][0][1] = tot2 + 1 ;
    if(!col[s])
    {
        if(cnt1&1) dp[s][0][0] += add1 ;
        else dp[s][1][0] += add1 ;
        if(cnt2&1) dp[s][1][1] += add2 ;
        else dp[s][0][1] += add2 ;
    }
    else
    {
        if(cnt1&1) dp[s][1][0] += add1 ;
        else dp[s][0][0] += add1 ;
        if(cnt2&1) dp[s][0][1] += add2 ;
        else dp[s][1][1] += add2 ;
    }
    return ;
}

int main()
{
    int n ;
    scanf("%d",&n) ;
    for(int i = 1 ; i < n ; ++i)
    {
        int a , b ;
        scanf("%d%d",&a,&b) ;
        adj[a].push_back(b) ;
        adj[b].push_back(a) ;
    }
    for(int i = 1 ; i <= n ; ++i) scanf("%d",&col[i]) ;
    calc(1,0) ;
    long long ans = min(dp[1][0][0],dp[1][0][1]) ;
    if(ans>=INF) puts("impossible") ;
    else printf("%lld\n",ans) ;
    return 0 ;
}

Compilation message (stderr)

xanadu.cpp: In function 'int main()':
xanadu.cpp:66:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   66 |     scanf("%d",&n) ;
      |     ~~~~~^~~~~~~~~
xanadu.cpp:70:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   70 |         scanf("%d%d",&a,&b) ;
      |         ~~~~~^~~~~~~~~~~~~~
xanadu.cpp:74:40: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   74 |     for(int i = 1 ; i <= n ; ++i) scanf("%d",&col[i]) ;
      |                                   ~~~~~^~~~~~~~~~~~~~
#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...