/*
读题不仔细
翻转的时候应该是隔一个子节点翻一次、我最初理解成了所有子节点都要跟着翻转、、、
也就是 1 3 5 7
2 4 6 8
*/
#include <vector>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
void wa() { cout << "NO\n"; }
void ok() { cout << "YES\n"; }
typedef long long ll;
const int N = 1e5 + 10;
int n;
int a[N];
int b[N];
int lazy[N];
int father[N];// 爸爸的爸爸
vector <int> ans;
vector <int> G[N];
void dfs(int u, int fa) {
father[u] = fa; // 记入爸爸的爸爸
if (a[u] ^ lazy[father[fa]] != b[u]) {
lazy[u] = lazy[father[fa]] ^ 1;
ans.push_back(u);
}
else lazy[u] = lazy[father[fa]]; // 当前值一样了, 但是要记住 祖先更新了对后面所有节点都有贡献 所以要保持祖先的贡献
for (int v : G[u]) {
if (v == fa)continue;
dfs(v, u);
}
}
void solve() {
cin >> n;
for (int i = 1; i < n; i++) {
int u, v; cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> b[i];
dfs(1, 0);
cout << ans.size() << "\n";
for (int i : ans)cout << i << "\n";
}
signed main() {
int t = 1;
//cin >> t;
while (t--) {
solve();
}
return 0;
}
CodeForces - 429A 一道很好的dfs 典型更新问题
最新推荐文章于 2022-09-20 17:25:10 发布