結果
| 問題 | No.3769 Even Contraction |
| コンテスト | |
| ユーザー |
kidodesu
|
| 提出日時 | 2026-10-19 15:44:15 |
| 言語 | PyPy3 (8.0.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 363 ms / 2,000 ms |
| + 614µs | |
| コード長 | 1,841 bytes |
| 記録 | |
| コンパイル時間 | 100 ms |
| コンパイル使用メモリ | 64,388 KB |
| 実行使用メモリ | 99,912 KB |
| 最終ジャッジ日時 | 2026-10-19 15:44:30 |
| 合計ジャッジ時間 | 10,724 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 47 |
ソースコード
def main():
n = int(input())
node = [[] for _ in range(n)]
for _ in range(n-1):
u, v = list(map(lambda x: int(x)-1, input().split()))
node[u].append(v)
node[v].append(u)
A = list(map(int, input().split()))
D = [-1] * n
E = []
D[0] = 0
S = [0]
while S:
u = S.pop()
E.append(u)
for v in node[u]:
if D[v] == -1:
D[v] = D[u]+1
S.append(v)
inf = 1<<60
inf = float("INF")
dp = [[0, 0, -inf, -inf] for _ in range(n)]
for u in E[::-1]:
dpu = dp[u]
if A[u] == 1:
for v in node[u]:
if D[v] < D[u]: continue
dpv = dp[v]
if A[v] == A[u]:
dpu[0] += dpv[0]+1
else:
dpu[0] += max(dpv[0], dpv[2]+1, dpv[3]+1)
else:
for v in node[u]:
if D[v] < D[u]: continue
dpv = dp[v]
u0, u1, u2, u3 = dpu
v0, v1, v2, v3 = dpv
if A[v] == 1:
dpu[0] += dpv[0]
dpu[1] += dpv[0]+1
dpu[2] += dpv[0]+1
dpu[3] += dpv[0]+1
elif A[v] == A[u]:
v2 = max(v2, v3)
dpu[0] = u0+v0+1
dpu[1] = max(u1+v0, u1+v1+1)
dpu[2] = max(u2+v0, u1+v2+1, u2+v1+1, u2+v2+1)
dpu[3] = max(u3+v0, u3+v1+1, u3+v2+1)
else:
dpu[0] = u0+max(v0, v2, v3)
dpu[1] = u1+max(v0, v2+1, v3+1)
dpu[2] = u2+max(v0, v2+1, v3+1)
dpu[3] = max(u3+v0, u3+v2+1, u3+v3+1, u1+v1+1, u1+v2+1, u2+v1+1)
return max(dp[0][0], dp[0][2], dp[0][3])
print(main())
kidodesu