Submission #1174567

#TimeUsernameProblemLanguageResultExecution timeMemory
1174567PacybwoahBalanced Tree (info1cup18_balancedtree)C++20
0 / 100
4097 ms2000 KiB
#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
#include<set>
#include<cmath>
using namespace std;
typedef long long ll;
const int inf = 1e9;
vector<vector<int>> graph;
struct reroot{
    vector<int> vec, dp1, dp2;
    int n;
    reroot(int _n){
        n = _n;
        graph.resize(n + 1);
        vec.resize(n + 1);
        dp1.resize(n + 1);
        dp2.resize(n + 1);
    }
    void set_1(int x){
        vec[x] = 1;
    }
    void dfs1(int node, int parent){
        if(vec[node]) dp1[node] = 0;
        else dp1[node] = inf;
        for(auto &x: graph[node]){
            if(x == parent) continue;
            dfs1(x, node);
            dp1[node] = min(dp1[node], dp1[x] + 1);
        }
    }
    void dfs2(int node, int parent, int up){
        multiset<int> s;
        s.insert(up + 1);
        for(auto &x: graph[node]){
            if(x == parent) continue;
            s.insert(dp1[x] + 1);
        }
        dp2[node] = (*s.begin());
        if(vec[node]) s.insert(0);
        for(auto &x: graph[node]){
            if(x == parent) continue;
            s.erase(s.find(dp1[x] + 1));
            dfs2(x, node, (*s.begin()));
            s.insert(dp1[x] + 1);
        }
    }
    void do_dp(){
        dfs1(1, 1);
        dfs2(1, 1, inf);
    }
};
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin >> t;
    while(t--){
        int n;
        cin >> n;
        vector<vector<int>>().swap(graph);
        graph.resize(n + 1);
        for(int i = 1; i < n; i++){
            int a, b;
            cin >> a >> b;
            graph[a].push_back(b);
            graph[b].push_back(a);
        }
        vector<int> vec(n + 1);
        for(int i = 1; i <= n; i++) cin >> vec[i];
        int mini = inf, best = -1;
        for(int i = 0; i < (1 << n); i++){
            reroot zer(n), one(n);
            bool flag = 1;
            for(int j = 0; j < n; j++){
                if(i & (1 << j)){
                    if(vec[j + 1] == 0) flag = 0;
                    one.set_1(j + 1);
                }
                else{
                    if(vec[j + 1] == 1) flag = 0;
                    zer.set_1(j + 1);
                }
            }
            if(!flag) continue;
            int res = 0;
            zer.do_dp();
            one.do_dp();
            for(int j = 0; j < n; j++){
                if(i & (1 << j)){
                    res = max(res, one.dp2[j + 1]);
                }
                else{
                    res = max(res, zer.dp2[j + 1]);
                }
            }
            if(res < mini){
                mini = res;
                best = i;
            }
        }
        if(mini >= inf) cout << "-1\n";
        else{
            cout << mini << "\n";
            for(int j = 0; j < n; j++){
                if(best & (1 << j)) cout << "1 ";
                else cout << "0 ";
            }
            cout << "\n";
        }
    }
}
// g++ -std=c++17 -Wall -Wextra -Wshadow -fsanitize=undefined -fsanitize=address -o run pD.cpp -g
#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...