結果

問題 No.386 貪欲な領主
ユーザー noriocnorioc
提出日時 2021-07-13 03:52:24
言語 Python3
(3.13.1 + numpy 2.2.1 + scipy 1.14.1)
結果
TLE  
実行時間 -
コード長 2,334 bytes
コンパイル時間 93 ms
コンパイル使用メモリ 12,928 KB
実行使用メモリ 53,744 KB
最終ジャッジ日時 2024-07-02 06:35:17
合計ジャッジ時間 4,269 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 11 TLE * 5
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

import collections
class LCA:
def __init__(self, n, adj, us):
K = 1
while (1 << K) < n: K += 1
self.parent = [[-1] * n for _ in range(K)]
self.dist = [-1] * n
self.cost = [-1] * n
self._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] = -1
else:
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] = par
self.dist[node] = d
self.cost[node] = c
for nd in adj[node]:
if nd == par: continue
s.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, u
K = 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 u
for 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.readline
N = 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 = 0
for _ 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 * c
print(ans)
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0