Codeforces Round #245 (Div. 1)——Xor-tree
阿新 • • 發佈:2018-11-20
- 題意:
給一棵樹n個節點,1為根節點。操作為,選定一個節點x。當前值取反,x的孫子,孫子的孫子。。。
均取反
如今告訴初始時每一個點的值和最後每一個點的目標值。求操作次數最少時須要選擇那些節點
(1 ≤ n ≤ 105) - 分析:
深度淺的點一定是受影響最小的(根節點僅僅受自己的影響)。所以從根依次向下遞推處理就可以
const int MAXN = 110000; VI G[MAXN], ans; int now[MAXN], goal[MAXN]; void dfs(int u, int fa, int a, int b) { int rev = ((now[u] ^ a) != goal[u]); if (rev) { ans.push_back(u); a ^= 1; } REP(i, G[u].size()) { int v = G[u][i]; if (v != fa) dfs(v, u, b, a); } } int main() { // freopen("in.txt", "r", stdin); int n, a, b; while (~RI(n)) { FE(i, 0, n) G[i].clear(); ans.clear(); REP(i, n - 1) { RII(a, b); G[a].push_back(b); G[b].push_back(a); } FE(i, 1, n) RI(now[i]); FE(i, 1, n) RI(goal[i]); dfs(1, 0, 0, 0); WI(ans.size()); REP(i, ans.size()) WI(ans[i]); } return 0; }