結果
問題 | No.2764 Warp Drive Spacecraft |
ユーザー |
|
提出日時 | 2024-04-29 11:36:41 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,667 ms / 3,000 ms |
コード長 | 2,408 bytes |
コンパイル時間 | 201 ms |
コンパイル使用メモリ | 82,816 KB |
実行使用メモリ | 216,136 KB |
最終ジャッジ日時 | 2024-07-17 20:23:08 |
合計ジャッジ時間 | 28,361 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 35 |
ソースコード
import heapqINF = 2 * 10**18class StaticCHT:# funcs: 一次関数 f(x)=ax+b: (a, b) のリストdef __init__(self, funcs):by_a = {}for a, b in funcs:if a in by_a:by_a[a] = min(by_a[a], b)else:by_a[a] = bfuncs = sorted(by_a.items(), key = lambda f: -f[0])# 交点を求めるself.points = []self.funcs = [funcs[0]]for i in range(len(funcs) - 1):a1, b1 = funcs[i]a2, b2 = funcs[i + 1]self.points.append((b1 - b2, a2 - a1))self.funcs.append((a2, b2))while len(self.points) >= 2:p1, q1 = self.points[-2]p2, q2 = self.points[-1]if p1 * q2 <= p2 * q1:breakself.funcs.pop(-2)self.points.pop()self.points.pop()a1, b1 = self.funcs[-2]a2, b2 = self.funcs[-1]self.points.append((b1 - b2, a2 - a1))# 点 x における最小値を求めるdef min(self, x):l, r = 0, len(self.points)while l < r:mid = (l + r) // 2p, q = self.points[mid]if x * q <= p:l = mid + 1else:r = mida, b = self.funcs[l]return a * x + bdef dijkstra(graph, start, inf = 10**18):dist = [inf] * len(graph)dist[start] = 0pq = []heapq.heappush(pq, (0, start))while pq:d, u = heapq.heappop(pq)if d > dist[u]:continuefor v, w in graph[u]:if dist[v] > d + w:dist[v] = d + wheapq.heappush(pq, (d + w, v))return distN, M = map(int, input().split())W = list(map(int, input().split()))edges = [list(map(int, input().split())) for _ in range(M)]graph = [[] for _ in range(N)]for u, v, t in edges:graph[u - 1].append((v - 1, t))graph[v - 1].append((u - 1, t))dist_s = dijkstra(graph, 0, INF)dist_t = dijkstra(graph, N - 1, INF)ans = dist_s[N - 1]# dist_s[i] + dist_t[j] + W[i] * W[j]funcs = []for j in range(N):if dist_t[j] < INF:funcs.append((W[j], dist_t[j]))cht = StaticCHT(funcs)for i in range(N):if dist_s[i] < INF:ans = min(ans, dist_s[i] + cht.min(W[i]))print(ans)