제출 #1323852

#제출 시각아이디문제언어결과실행 시간메모리
1323852yhkhooThe Xana coup (BOI21_xanadu)C++20
100 / 100
37 ms17896 KiB
#include <bits/stdc++.h>
using namespace std;

#define pb push_back

typedef pair<int, int> pii;
#define fi first
#define se second

const int MAXN = 100005;
int n, po[MAXN], pc = 0;
bitset<MAXN> a;
basic_string<int> al[MAXN];

void dfs(int x){
    po[x] = pc++;
    for(auto nx: al[x]){
        if(po[nx] || nx == 0) continue;
        dfs(nx);
    }
}

typedef array<int, 2> aii;

aii memo[MAXN][2];

aii dp(int x, bool tog){
    aii& mem = memo[x][tog];
    if(mem[0] != -1){
        return mem;
    }
    int mc=0, mt=MAXN;
    bool mct=0;
    for(auto nx: al[x]){
        if(po[nx] < po[x]) continue;
        int ct0 = dp(nx, 0)[tog], ct1 = dp(nx, 1)[tog];
        if(ct0 < ct1){
            mc += ct0;
        }
        else{
            mct = !mct;
            mc += ct1;
        }
        mt = min(mt, abs(ct0 - ct1));
    }
    bool cs = mct ^ tog ^ a[x];
    mem = {mc + tog, mc + tog + mt};
    if(cs){
        swap(mem[0], mem[1]);
    }
    return mem;
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> n;
    for(int i=0, a, b; i<n-1; i++){
        cin >> a >> b;
        a--; b--;
        al[a].pb(b);
        al[b].pb(a);
    }
    for(int i=0; i<n; i++){
        bool x;
        cin >> x;
        a[i] = x;
    }
    dfs(0);
    memset(memo, -1, sizeof(memo));
    int ans = min(dp(0, 0)[0], dp(0, 1)[0]);
    if(ans >= MAXN){
        cout << "impossible";
    }
    else{
        cout << ans;
    }
    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...