結果
| 問題 |
No.1928 Make a Binary Tree
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 19:57:14 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,022 bytes |
| コンパイル時間 | 348 ms |
| コンパイル使用メモリ | 82,940 KB |
| 実行使用メモリ | 848,652 KB |
| 最終ジャッジ日時 | 2025-06-12 19:58:49 |
| 合計ジャッジ時間 | 24,360 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 3 WA * 32 MLE * 12 -- * 10 |
ソースコード
import sys
from collections import deque
def main():
sys.setrecursionlimit(1 << 25)
N = int(sys.stdin.readline())
edges = [[] for _ in range(N+1)]
for _ in range(N-1):
x, y = map(int, sys.stdin.readline().split())
edges[x].append(y)
edges[y].append(x)
# Build parent and children arrays using BFS
parent = [0] * (N + 1)
children = [[] for _ in range(N + 1)]
visited = [False] * (N + 1)
q = deque()
q.append(1)
visited[1] = True
parent[1] = 0
while q:
u = q.popleft()
for v in edges[u]:
if not visited[v]:
visited[v] = True
parent[v] = u
children[u].append(v)
q.append(v)
# Post-order traversal using iterative approach
post_order = []
stack = [(1, False)]
while stack:
node, processed = stack.pop()
if processed:
post_order.append(node)
continue
stack.append((node, True))
# Push children in reverse order to process them left to right
for c in reversed(children[node]):
stack.append((c, False))
# DP arrays
dp = [0] * (N + 1)
max1 = [0] * (N + 1) # Top candidate value for each node
max2 = [0] * (N + 1) # Second top candidate value
for u in post_order:
candidates = []
# Step 1: Add top two from each child's candidates
for c in children[u]:
candidates.append(max1[c])
candidates.append(max2[c])
# Step 2: Add DP of original children
for v in children[u]:
candidates.append(dp[v])
# Find top two values in candidates
m1 = m2 = 0
for val in candidates:
if val > m1:
m2 = m1
m1 = val
elif val > m2:
m2 = val
max1[u] = m1
max2[u] = m2
dp[u] = 1 + m1 + m2
print(dp[1])
if __name__ == "__main__":
main()
gew1fw