結果
問題 | No.2377 SUM AND XOR on Tree |
ユーザー |
![]() |
提出日時 | 2025-03-20 20:58:46 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,350 ms / 4,000 ms |
コード長 | 2,499 bytes |
コンパイル時間 | 438 ms |
コンパイル使用メモリ | 82,172 KB |
実行使用メモリ | 202,844 KB |
最終ジャッジ日時 | 2025-03-20 21:00:09 |
合計ジャッジ時間 | 23,112 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 33 |
ソースコード
MOD = 998244353def main():import sysinput = sys.stdin.readdata = input().split()idx = 0n = int(data[idx])idx += 1edges = [[] for _ in range(n+1)]for _ in range(n-1):u = int(data[idx])v = int(data[idx+1])edges[u].append(v)edges[v].append(u)idx += 2A = list(map(int, data[idx:idx+n]))idx += n# Build the tree structure with parent pointers and children listroot = 1parent = [0] * (n + 1)children = [[] for _ in range(n + 1)]stack = [(root, 0)]while stack:u, p = stack.pop()parent[u] = pfor v in edges[u]:if v != p:children[u].append(v)stack.append((v, u))total_ans = 0for b in range(30):# Compute a[u] for each node u (bit b)a = [0] * (n + 1)sum_xor = 0for u in range(1, n+1):au = (A[u-1] >> b) & 1a[u] = ausum_xor ^= audp0 = [0] * (n + 1)dp1 = [0] * (n + 1)# Iterative post-order traversalstack = [(root, False)]while stack:u, visited = stack.pop()if not visited:stack.append((u, True))for v in reversed(children[u]):stack.append((v, False))else:# Initialize with node u's a valueif a[u] == 0:curr0, curr1 = 1, 0else:curr0, curr1 = 0, 1for v in children[u]:v0 = dp0[v]v1 = dp1[v]# Disconnect: curr * v1new0 = (curr0 * v1) % MODnew1 = (curr1 * v1) % MOD# Connect: curr * v0 and curr * v1, for both curr0 and curr1con0 = (curr0 * v0 + curr1 * v1) % MODcon1 = (curr0 * v1 + curr1 * v0) % MODnew0 = (new0 + con0) % MODnew1 = (new1 + con1) % MODcurr0, curr1 = new0, new1dp0[u], dp1[u] = curr0, curr1ways = dp1[root]total_ans = (total_ans + (ways << b)) % MODprint(total_ans % MOD)if __name__ == "__main__":main()