https://atcoder.jp/contests/abc138/tasks/abc138_d
についての質問です
問題文
1 から N までの番号がついた N 個の頂点を持つ根付き木が与えられます。 この木の根は頂点 1 で、 番目の辺 (1≤≤N−1) は頂点 aと頂点 b
を結びます。
各頂点にはカウンターが設置されており、はじめすべての頂点のカウンターの値は 0 です。
これから、以下のような Q 回の操作が行われます。
操作 (1≤≤Q): 頂点 p を根とする部分木に含まれるすべての頂点のカウンターの値に x を足す。
すべての操作のあとの各頂点のカウンターの値を求めてください。
ACしないコード
python
1n, q = map(int, input().split()) 2 3arr = [[] for i in range(n)] 4for _ in range(n-1): 5 a, b = map(int,input().split()) 6 arr[a-1].append(b-1) 7 8ans = [0 for i in range(n)] 9for _ in range(q): 10 p, v = map(int,input().split()) 11 ans[p-1] += v 12 13q = [0] 14while q: 15 t = q.pop(-1) 16 for j in arr[t]: 17 ans[j] += ans[t] 18 q.append(j) 19 20print(*ans)
ACする変更後のコード
python
1import sys 2sys.setrecursionlimit(10**9) 3n, q = map(int, input().split()) 4 5arr = [[] for i in range(n)] 6for _ in range(n-1): 7 a, b = map(int,input().split()) 8 a -= 1 9 b -= 1 10 # 双方向に変更 11 arr[a].append(b) 12 arr[b].append(a) 13 14ans = [0 for i in range(n)] 15for _ in range(q): 16 p, v = map(int,input().split()) 17 p -= 1 18 ans[p] += v 19# dfsで算出 20def dfs(v,p): 21 for i in arr[v]: 22 if i == p: 23 continue 24 ans[i] += ans[v] 25 dfs(i,v) 26 27dfs(0,-1) 28print(*ans)
なぜACにならないのかわかりません。
木構造を双方向にする点とdfsでなければ求められない理由を教えていただけないでしょうか
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/09 16:13