제출 #1149610

#제출 시각아이디문제언어결과실행 시간메모리
1149610LudisseyThe Xana coup (BOI21_xanadu)C++20
100 / 100
127 ms52036 KiB
#include <bits/stdc++.h>
#define int long long
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
 
using namespace std;
int n;
vector<int> on;
vector<vector<int>> neigh; 
vector<vector<int>> child; 
vector<vector<vector<int>>> memo; 

void make_tree(int x, int p){
    for (auto u : neigh[x])
    {
        if(u==p) continue;
        make_tree(u,x);
        child[x].push_back(u);
    }
}

int dp(int x, bool sta, bool tog){
    if(on[x]) sta=!sta;
    if(memo[x][sta][tog]!=-1) return memo[x][sta][tog];
    vector<pair<int,int>> val(sz(child[x]));
    vector<int> df(sz(child[x]));
    int sm=0;
    for (int i = 0; i < sz(child[x]); i++)
    {
        int u=child[x][i];
        val[i]={dp(u,tog,false), dp(u,tog,true)};
        df[i]=val[i].second-val[i].first;
        sm+=val[i].first;
    }
    sort(all(df));
    bool stat=sta^tog;
    if(stat){
        if(sz(child[x])==0) return memo[x][sta][tog]=1e9;
        sm+=df[0];
    }
    int mnSUM=sm;
    for (int i = stat; i < sz(child[x])-1; i+=2) {
        sm+=df[i]+df[i+1];
        mnSUM=min(mnSUM,sm);
    }
    return memo[x][sta][tog]=mnSUM+tog;
}

signed main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    cin >> n;
    neigh.resize(n);
    on.resize(n);
    child.resize(n);
    memo.resize(n,vector<vector<int>>(2,vector<int>(2,-1)));
    for (int i = 0; i < n-1; i++)
    {
        int a,b; cin >> a >> b;
        a--; b--;
        neigh[a].push_back(b);
        neigh[b].push_back(a);
    }
    for (int i = 0; i < n; i++) cin >> on[i];
    make_tree(0, -1);
    int d=min(dp(0,0,1),dp(0,0,0));
    
    if(d>=1e9) cout << "impossible\n";
    else cout << d << "\n";
    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...