結果
問題 | No.1976 Cut then Connect |
ユーザー |
👑 |
提出日時 | 2022-06-11 15:16:14 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 297 ms / 2,000 ms |
コード長 | 2,005 bytes |
コンパイル時間 | 222 ms |
コンパイル使用メモリ | 82,420 KB |
実行使用メモリ | 90,748 KB |
最終ジャッジ日時 | 2024-11-24 12:17:29 |
合計ジャッジ時間 | 6,103 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 31 |
ソースコード
import syssys.setrecursionlimit(10 ** 9)# import pypyjit# pypyjit.set_param('max_unroll_recursion=-1')n = int(input())edges = [[] for _ in range(n)]for _ in range(n - 1):u, v = map(int, input().split())u -= 1v -= 1edges[u].append(v)edges[v].append(u)max_R = [0] * nmax_dist = [0] * ndef dfs(pos, bpos):ma1 = 0ma2 = 0for npos in edges[pos]:if npos == bpos:continuedfs(npos, pos)if max_R[pos] < max_R[npos]:max_R[pos] = max_R[npos]if ma2 < max_dist[npos] + 1:ma2 = max_dist[npos] + 1if ma2 > ma1:ma1, ma2 = ma2, ma1max_dist[pos] = ma1max_R[pos] = max(max_R[pos], ma1 + ma2)dfs(0, -1)ans = ndef dfs2(pos, bpos):if bpos != -1:global ansr1 = max_R[bpos]r2 = max_R[pos]tmp = max((r1 + 1) // 2 + (r2 + 1) // 2 + 1, r1, r2)ans = min(ans, tmp)ma1 = 0ma2 = 0ma3 = 0le = len(edges[pos])L_r = [0] * (le + 1)R_r = [0] * (le + 1)for i, npos in enumerate(edges[pos], 1):L_r[i] = max(L_r[i - 1], max_R[npos])if ma3 < max_dist[npos] + 1:ma3 = max_dist[npos] + 1if ma3 > ma2:ma2, ma3 = ma3, ma2if ma2 > ma1:ma1, ma2 = ma2, ma1for i in range(le - 1, -1, -1):npos = edges[pos][i]R_r[i] = max(R_r[i + 1], max_R[npos])for i, npos in enumerate(edges[pos]):if npos == bpos:continuemax_R[pos] = max(L_r[i], R_r[i + 1])if max_dist[npos] + 1 == ma1:max_dist[pos] = ma2max_R[pos] = max(max_R[pos], ma2 + ma3)elif max_dist[npos] + 1 == ma2:max_dist[pos] = ma1max_R[pos] = max(max_R[pos], ma1 + ma3)else:max_dist[pos] = ma1max_R[pos] = max(max_R[pos], ma1 + ma2)dfs2(npos, pos)dfs2(0 ,-1)print(ans)