結果
問題 | No.1221 木 *= 3 |
ユーザー | uni_python |
提出日時 | 2020-09-06 22:51:49 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 638 ms / 2,000 ms |
コード長 | 2,315 bytes |
コンパイル時間 | 161 ms |
コンパイル使用メモリ | 82,292 KB |
実行使用メモリ | 117,924 KB |
最終ジャッジ日時 | 2024-11-29 07:46:06 |
合計ジャッジ時間 | 10,283 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 70 ms
67,328 KB |
testcase_01 | AC | 64 ms
67,200 KB |
testcase_02 | AC | 64 ms
67,328 KB |
testcase_03 | AC | 66 ms
67,328 KB |
testcase_04 | AC | 63 ms
66,816 KB |
testcase_05 | AC | 64 ms
67,328 KB |
testcase_06 | AC | 65 ms
67,200 KB |
testcase_07 | AC | 609 ms
117,628 KB |
testcase_08 | AC | 606 ms
117,548 KB |
testcase_09 | AC | 638 ms
117,924 KB |
testcase_10 | AC | 628 ms
117,776 KB |
testcase_11 | AC | 632 ms
117,832 KB |
testcase_12 | AC | 357 ms
116,676 KB |
testcase_13 | AC | 359 ms
116,956 KB |
testcase_14 | AC | 369 ms
117,000 KB |
testcase_15 | AC | 370 ms
116,800 KB |
testcase_16 | AC | 368 ms
116,752 KB |
testcase_17 | AC | 589 ms
115,764 KB |
testcase_18 | AC | 587 ms
116,052 KB |
testcase_19 | AC | 600 ms
115,596 KB |
testcase_20 | AC | 608 ms
115,804 KB |
testcase_21 | AC | 595 ms
115,764 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()