結果
| 問題 | No.1221 木 *= 3 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-09-13 04:07:30 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 261 ms / 2,000 ms |
| コード長 | 1,220 bytes |
| 記録 | |
| コンパイル時間 | 501 ms |
| コンパイル使用メモリ | 82,048 KB |
| 実行使用メモリ | 107,432 KB |
| 最終ジャッジ日時 | 2025-01-02 20:01:35 |
| 合計ジャッジ時間 | 6,753 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 18 |
ソースコード
import sys
input = sys.stdin.readline
N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
edge = [[] for _ in range(N)]
for i in range(N-1):
a,b = map(int, input().split())
edge[a-1].append(b-1)
edge[b-1].append(a-1)
# def dfs1(v, p):
# if p>=0 and len(edge[v])==1:
# offs, ons = max(A[v],0), max(A[v],B[v]+B[p])
# return offs, ons
# offs, ons = A[v],0
# for u in edge[v]:
# if u!=p:
# off, on = dfs1(u, v)
# offs += off
# ons += on
# if p==-1:
# return offs, ons
# return max(offs,ons),max(offs,ons+B[v]+B[p])
def dfs2(start):
stack = [start]
parent = [N]*N
parent[start] = -1
offs = A[:]
ons = [0]*N
while stack:
v = stack[-1]
marker = 0
for u in edge[v]:
if u==parent[v]:
continue
if parent[u]==N: #前半
marker = 1
parent[u]=v
stack.append(u)
else: #後半
offs[v] += offs[u]
ons[v] += ons[u]
if marker==0: #後半だったら
stack.pop()
if v==start:
continue
offs[v], ons[v] = max(offs[v],ons[v]), max(offs[v],ons[v]+B[v]+B[parent[v]])
return offs[0], ons[0]
off2, on2 = dfs2(0)
print(max(off2,on2))