結果
問題 | No.2377 SUM AND XOR on Tree |
ユーザー |
|
提出日時 | 2024-09-05 20:02:25 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 3,806 ms / 4,000 ms |
コード長 | 2,378 bytes |
コンパイル時間 | 772 ms |
コンパイル使用メモリ | 82,468 KB |
実行使用メモリ | 285,544 KB |
最終ジャッジ日時 | 2024-09-05 20:03:28 |
合計ジャッジ時間 | 59,685 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 33 |
ソースコード
## https://yukicoder.me/problems/no/2377from collections import dequeMOD = 998244353def solve(N, next_nodes, bit_a_list):# (現役で繋がろうとしている成分の現時点の1xor, すでに完結している連結成分たちの1xor のAnd)# 0: (0, 1), 1: (1, 1)dp = [[0, 0] for _ in range(N)]parents = [-2] * Nparents[0] = -1stack = deque()stack.append((0, 0))while len(stack) > 0:v, index = stack.pop()if index == 0:dp[v][bit_a_list[v]] = 1else:w = next_nodes[v][index - 1]new_dp = [0] * 2for state in range(2):state_num = dp[w][state]for base_state in range(2):base_state_num = dp[v][base_state]# つなげるnew_state = state ^ base_statenew_dp[new_state] += (state_num * base_state_num) % MODnew_dp[new_state] %= MOD# 独立させるif state == 1:new_state = base_statenew_dp[new_state] += (state_num * base_state_num) % MODnew_dp[new_state] %= MODdp[v] = new_dpwhile index < len(next_nodes[v]):w = next_nodes[v][index]if w == parents[v]:index += 1continueparents[w] = vstack.append((v, index + 1))stack.append((w, 0))break# 最後の仕上げreturn dp[0][1]def main():N = int(input())next_nodes = [[] for _ in range(N)]for _ in range(N - 1):u, v = map(int, input().split())next_nodes[u - 1].append(v - 1)next_nodes[v - 1].append(u - 1)A = list(map(int, input().split()))# Aの各ビットごとに1の数を計算max_a = max(A)k = 0while (1 << k) < max_a:k += 1max_k = kanswer = 0for k in range(max_k + 1):bit_a_list = [0] * Nfor i in range(N):a = A[i]bit_a_list[i] = 1 if a & (1 << k) > 0 else 0count = solve(N, next_nodes, bit_a_list)answer += (count * (1 << k)) % MODanswer %= MODprint(answer)if __name__ == '__main__':main()