結果
問題 | No.1215 都市消滅ビーム |
ユーザー |
![]() |
提出日時 | 2025-03-31 17:40:15 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,262 bytes |
コンパイル時間 | 125 ms |
コンパイル使用メモリ | 82,600 KB |
実行使用メモリ | 345,976 KB |
最終ジャッジ日時 | 2025-03-31 17:41:55 |
合計ジャッジ時間 | 9,734 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 2 |
other | AC * 13 TLE * 1 -- * 26 |
ソースコード
import sysfrom sys import stdinfrom collections import dequesys.setrecursionlimit(1 << 25)def main():import sysinput = sys.stdin.readdata = input().split()idx = 0N, K = int(data[idx]), int(data[idx+1])idx +=2C = list(map(int, data[idx:idx+K]))idx +=KD = list(map(int, data[idx:idx+K]))idx +=Kedges = [[] for _ in range(N+1)]for _ in range(N-1):a, b = int(data[idx]), int(data[idx+1])edges[a].append(b)edges[b].append(a)idx +=2LOG = 20parent = [[-1]*(N+1) for _ in range(LOG)]depth = [0]*(N+1)stack = [(1, -1, 0)]while stack:v, p, d = stack.pop()parent[0][v] = pdepth[v] = dfor u in edges[v]:if u != p:stack.append((u, v, d+1))for k in range(1, LOG):for v in range(1, N+1):if parent[k-1][v] != -1:parent[k][v] = parent[k-1][parent[k-1][v]]def lca(u, v):if depth[u] < depth[v]:u, v = v, ufor k in range(LOG-1, -1, -1):if parent[k][u] != -1 and depth[parent[k][u]] >= depth[v]:u = parent[k][u]if u == v:return ufor k in range(LOG-1, -1, -1):if parent[k][u] != parent[k][v]:u = parent[k][u]v = parent[k][v]return parent[0][u]left_LCA = [ -1 ] * (K + 2)current_LCA = -1for l in range(2, K+2):if l-1 == 1:current_LCA = C[0]else:current_LCA = lca(current_LCA, C[l-2])left_LCA[l] = current_LCAright_LCA = [ -1 ] * (K +2)current_LCA = -1for r in range(K, 0, -1):if r == K:current_LCA = C[K-1]else:current_LCA = lca(current_LCA, C[r-1])right_LCA[r] = current_LCAtotal_D = sum(D)prefix = [0]*(K+1)for i in range(1, K+1):prefix[i] = prefix[i-1] + D[i-1]X_list = []optional_case = Truel_full = K + 1if l_full <= K+1 and left_LCA[l_full] != -1:T = left_LCA[l_full]sum_S = total_Ddepth_T = depth[T]X = sum_S + depth_TX_list.append(X)for l in range(1, K+1):for r in range(l, K+1):if l == 1 and r == K:X = -10**10X_list.append(X)continuehas_left = l > 1has_right = r < KT = -1if has_left and has_right:l_lca = left_LCA[l]r_lca = right_LCA[r+1]T = lca(l_lca, r_lca)elif has_left:T = left_LCA[l]elif has_right:T = right_LCA[r+1]else:assert False, "Should be handled by l ==1 and r==K case"sum_lr = prefix[r] - prefix[l-1]sum_S = total_D - sum_lrdepth_T_val = depth[T]X = sum_S + depth_T_valX_list.append(X)M = K*(K+1)//2 +1X_list.sort()median_pos = (M +1) //2 -1print(X_list[median_pos])if __name__ == "__main__":main()