結果
問題 | No.1221 木 *= 3 |
ユーザー | uni_python |
提出日時 | 2020-09-06 22:51:49 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 634 ms / 2,000 ms |
コード長 | 2,315 bytes |
コンパイル時間 | 168 ms |
コンパイル使用メモリ | 82,432 KB |
実行使用メモリ | 117,972 KB |
最終ジャッジ日時 | 2024-05-06 21:35:57 |
合計ジャッジ時間 | 9,732 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 75 ms
66,944 KB |
testcase_01 | AC | 77 ms
67,072 KB |
testcase_02 | AC | 70 ms
66,944 KB |
testcase_03 | AC | 71 ms
67,328 KB |
testcase_04 | AC | 70 ms
67,200 KB |
testcase_05 | AC | 72 ms
67,072 KB |
testcase_06 | AC | 71 ms
67,584 KB |
testcase_07 | AC | 609 ms
117,380 KB |
testcase_08 | AC | 607 ms
117,972 KB |
testcase_09 | AC | 625 ms
117,796 KB |
testcase_10 | AC | 634 ms
117,780 KB |
testcase_11 | AC | 615 ms
117,772 KB |
testcase_12 | AC | 351 ms
116,692 KB |
testcase_13 | AC | 350 ms
116,932 KB |
testcase_14 | AC | 360 ms
116,752 KB |
testcase_15 | AC | 358 ms
116,996 KB |
testcase_16 | AC | 353 ms
116,820 KB |
testcase_17 | AC | 568 ms
115,700 KB |
testcase_18 | AC | 541 ms
115,788 KB |
testcase_19 | AC | 562 ms
115,912 KB |
testcase_20 | AC | 565 ms
115,612 KB |
testcase_21 | AC | 572 ms
115,672 KB |
ソースコード
import sys input=sys.stdin.readline def I(): return int(input()) def MI(): return map(int, input().split()) def LI(): return list(map(int, input().split())) """ 頂点を消すときに直接影響が及ぶのは,その頂点&隣接する頂点(=j)のみ. +a -bi*di -Σbj ←頂点jの次数が1減る分 なんだけど,bjが存在するかどうかでこの影響値が変わるのかぁ. 例1を見て,頂点3だけ見れば消さない方がいいんだけど,頂点1がもし消えていれば消した方が良い. これを考慮する必要があるので,結局影響が波及してしまう 木DPぽく,部分木の根の頂点が存在する場合と存在しない場合とでそれぞれ最大値を出しておくか? 部分木の根がない場合: 子の頂点を根に持つ部分木のmax(頂点なし,頂点あり)の総和 + ai 部分木の根がある場合: 子の頂点を根に持つ部分木のmax(頂点なし,頂点あり+bi+bj)の総和 """ def main(): N=I() A=LI() B=LI() adj=[[]for _ in range(N)] for _ in range(N-1): u,v=MI() u-=1 v-=1 adj[u].append(v) adj[v].append(u) import queue q=queue.Queue() q.put((0,-1)) D=[0]*N G=[[]for _ in range(N)] # 子のリスト while not q.empty(): v,p=q.get() for nv in adj[v]: if nv!=p: G[v].append(nv) D[nv]=D[v]+1 q.put((nv,v)) L=[] for i in range(N): aaa=(D[i],i) L.append(aaa) L.sort(reverse=True) # 深い順に見る inf=10**16 dp1=[-inf]*N # iが頂点となる部分木において,iがない場合の最大値 dp2=[0]*N # iが頂点となる部分木において,iがある場合の最大値 for i in range(N): v=L[i][1] # vがない場合 temp=A[v] for nv in G[v]: temp+=max(dp1[nv], dp2[nv]) dp1[v]=temp #vがある場合 temp=0 for nv in G[v]: temp+=max(dp1[nv], dp2[nv]+B[v]+B[nv]) dp2[v]=temp print(max(dp1[0], dp2[0])) main()