結果
問題 |
No.2205 Lights Out on Christmas Tree
|
ユーザー |
![]() |
提出日時 | 2025-03-20 18:49:06 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 326 ms / 2,000 ms |
コード長 | 1,900 bytes |
コンパイル時間 | 283 ms |
コンパイル使用メモリ | 82,900 KB |
実行使用メモリ | 176,780 KB |
最終ジャッジ日時 | 2025-03-20 18:50:44 |
合計ジャッジ時間 | 10,395 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 37 |
ソースコード
import sys from collections import deque def main(): sys.setrecursionlimit(1 << 25) n = int(sys.stdin.readline()) edges = [[] for _ in range(n)] # (to, idx) for idx in range(n-1): a, b = map(int, sys.stdin.readline().split()) a -= 1 b -= 1 edges[a].append((b, idx)) edges[b].append((a, idx)) c = list(map(int, sys.stdin.readline().split())) d = [(1 - c[i]) % 2 for i in range(n)] if sum(d) % 2 != 0: print(-1) return root = 0 parent = [-1] * n edge_idx = [-1] * n # edge index to parent q = deque() q.append(root) parent[root] = -1 while q: u = q.popleft() for v, idx in edges[u]: if parent[v] == -1 and v != root: parent[v] = u edge_idx[v] = idx q.append(v) children = [[] for _ in range(n)] for v in range(n): if parent[v] != -1: children[parent[v]].append(v) post_order = [] stack = [(root, False)] visited = [False] * n while stack: v, processed = stack.pop() if processed: post_order.append(v) continue if visited[v]: continue visited[v] = True stack.append((v, True)) for child in reversed(children[v]): stack.append((child, False)) x_arr = [0] * (n-1) for v in post_order: if v == root: continue sum_child = 0 for child in children[v]: sum_child += x_arr[edge_idx[child]] sum_child %= 2 required = (d[v] - sum_child) % 2 x_arr[edge_idx[v]] = required sum_root = sum(x_arr[edge_idx[child]] for child in children[root]) % 2 assert sum_root == d[root], "Root condition not met" print(sum(x_arr)) if __name__ == "__main__": main()