Submission #1174698

#TimeUsernameProblemLanguageResultExecution timeMemory
1174698PacybwoahBalanced Tree (info1cup18_balancedtree)C++20
13.50 / 100
38 ms2156 KiB
#pragma GCC optimize("O3,unroll-loops") #pragma GCC target("bmi,bmi2,avx,avx2") #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){ dp2[node] = up + 1; int sz = (int)graph[node].size(); if(node != 1) sz--; vector<int> pre(sz + 1, inf), suf(sz + 1); int cnt = 0; for(auto &x: graph[node]){ if(x == parent) continue; dp2[node] = min(dp2[node], dp1[x] + 1); cnt++; pre[cnt] = dp1[x] + 1; suf[cnt] = dp1[x] + 1; } //cout << node << " " << dp2[node] << endl; for(int i = 1; i <= sz; i++) pre[i] = min(pre[i], pre[i - 1]); for(int i = sz - 1; i > 0; i--) suf[i] = min(suf[i], suf[i + 1]); cnt = 0; for(auto &x: graph[node]){ if(x == parent) continue; cnt++; int down = up + 1; if(vec[node]) down = 0; down = min(down, pre[cnt - 1]); if(cnt < sz) down = min(down, suf[cnt + 1]); dfs2(x, node, down); } } 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]; reroot zer(n), one(n); for(int i = 1; i <= n; i++){ if(vec[i] == 0){ zer.set_1(i); } else if(vec[i] == 1){ one.set_1(i); } else{ zer.set_1(i); one.set_1(i); } } int ans = 0; zer.do_dp(); one.do_dp(); for(int i = 1; i <= n; i++){ if(vec[i] == 0){ ans = max(ans, zer.dp2[i]); } else if(vec[i] == 1){ ans = max(ans, one.dp2[i]); } } if(ans >= inf){ cout << "-1\n"; continue; } cout << ans + 2 << "\n"; for(int i = 1; i <= n; i++){ if(vec[i] == 1) 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...