题解:CF1626E Black and White Tree
题目传送门
首先,对于任意点
-
-
 -
 
如果以每个点为根暴力 dfs 肯定会超时,所以我们先以
代码附上————
#include<bits/stdc++.h>
// #define int long long
using namespace std;
const int maxn = 300010;
const int inf = 1e9;
//unsigned long long
//cout << fixed << setprecision(3)
//cout << setw(5) <<
//continue
int a[maxn], si[maxn], f[maxn], cnt, cnt1, t[maxn * 2], nxt[maxn * 2], head[maxn];
bool ans[maxn];
void add(int x, int y){
cnt1++;
t[cnt1] = y;
nxt[cnt1] = head[x];
head[x] = cnt1;
}
void dfs(int x, int fa){
si[x] = a[x];
f[x] = fa;
for(int i = head[x];i;i = nxt[i]){
int to = t[i];
if(to == fa) continue;
dfs(to, x);
si[x] += si[to];
if(a[to] || (si[to] >= 2 && ans[to])){
ans[x] = 1;
}
}
}
void dfs1(int x, int fa){
if(a[fa]) ans[x] = 1;
for(int i = head[x];i;i = nxt[i]){
int to = t[i];
if(to == fa) continue;
if(ans[x] && si[1] - si[to] >= 2){
ans[to] = 1;
}
dfs1(to, x);
}
}
signed main(){
//freopen("a.in", "r", stdin);
//freopen("a.out", "w", stdout);
int n;
cin >> n;
for(int i = 1;i <= n;i++){
cin >> a[i];
cnt += a[i];
ans[i] = a[i];
}
// cout << cnt << endl;
for(int i = 1;i < n;i++){
int x, y;
cin >> x >> y;
add(x, y);
add(y, x);
}
dfs(1, 0);
dfs1(1, 0);
for(int i = 1;i <= n;i++){
cout << ans[i] << ' ';
}
return 0;
}