結果
問題 | No.386 貪欲な領主 |
ユーザー |
![]() |
提出日時 | 2021-07-13 03:51:42 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,338 bytes |
コンパイル時間 | 85 ms |
コンパイル使用メモリ | 12,928 KB |
実行使用メモリ | 60,684 KB |
最終ジャッジ日時 | 2024-07-02 06:34:35 |
合計ジャッジ時間 | 4,848 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | WA * 4 TLE * 1 -- * 11 |
ソースコード
import collectionsclass LCA:def __init__(self, n, adj, us):K = 1while (1 << K) < n: K += 1self.parent = [[-1] * n for _ in range(K)]self.dist = [-1] * nself.cost = [-1] * nself._dfs2(node=0, par=-1, d=0, adj=adj, us=us)for k in range(K-1):for v in range(n):if self.parent[k][v] < 0:self.parent[k+1][v] = -1else:self.parent[k+1][v] = self.parent[k][self.parent[k][v]]def _dfs2(self, node, par, d, adj, us):s = [(node, par, d, us[node])]while s:node, par, d, c = s.pop()self.parent[0][node] = parself.dist[node] = dself.cost[node] = cfor nd in adj[node]:if nd == par: continues.append((nd, node, d + 1, c + us[nd]))def query(self, u: int, v: int) -> int:if self.dist[u] < self.dist[v]: u, v = v, uK = len(self.parent)# LCA までの距離を同じにするfor k in range(K):if (self.dist[u] - self.dist[v]) >> k & 1:u = self.parent[k][u]# 二分探索で LCA を求めるif u == v: return ufor k in range(K-1, -1, -1):if self.parent[k][u] != self.parent[k][v]:u = self.parent[k][u]v = self.parent[k][v]return self.parent[0][u]def distance(self, u: int, v: int) -> int:return self.dist[u] + self.dist[v] - 2 * self.dist[self.query(u, v)]def get_cost(self, u: int, v: int) -> int:return self.cost[u] + self.cost[v] - 2 * self.cost[self.query(u, v)]def is_on_path(self, u, v, a) -> bool:return self.distance(u, a) + self.distance(a, v) == self.distance(u, v)import sys# input = sys.stdin.readlineN = int(input())adj = collections.defaultdict(list)for i in range(N-1):a, b = map(int, input().split())adj[a].append(b)adj[b].append(a)us = []for i in range(N):us.append(int(input()))Q = int(input())lca = LCA(N, adj, us)ans = 0for _ in range(Q):a, b, c = map(int, input().split())lca_node = lca.query(a, b)cost = lca.cost[a] + lca.cost[b] - 2 * lca.cost[lca_node] + us[lca_node]ans += cost * cprint(ans)