結果
| 問題 |
No.3351 Towering Tower
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-11-10 02:33:22 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,340 bytes |
| コンパイル時間 | 348 ms |
| コンパイル使用メモリ | 82,652 KB |
| 実行使用メモリ | 92,944 KB |
| 最終ジャッジ日時 | 2025-11-13 21:13:19 |
| 合計ジャッジ時間 | 11,431 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 1 |
| other | WA * 3 TLE * 1 -- * 23 |
ソースコード
def solve(n, g, h):
inf = -10 ** 18
h.append(-1)
def check(x):
L = [[inf, inf] for _ in range(n + 1)]
R = [[-inf, -inf] for _ in range(n + 1)]
# L[i][0] <= t[i] <= R[i][0] に対して、
# 2 * t[i]
# L[i][1] <= t[i] <= R[i][1] に対して、
# 2 * t[i] + 1 の時刻に到達可能
h[n] = x
for i in g[n]:
L[i][1] = 0
R[i][1] = 0
for time in range(n * 2):
for u in range(n + 1):
for v in g[u]:
if h[u] == h[v]:
if h[u] <= x:
for t in range(2):
L[v][t^1] = min(L[v][t^1], L[u][t] + t)
R[v][t^1] = max(R[v][t^1], R[u][t] + t)
elif h[u] > h[v]:
Y = (x - h[u]) // (h[u] - h[v])
# 2s + t <= Y
# min(R[v][t], (Y - t) // 2)
for t in range(2):
y = (Y - t) // 2
L[v][t^1] = min(L[v][t^1], L[u][t] + t)
R[v][t^1] = max(R[v][t^1], min(R[u][t] + t, y))
else:
Y = (x - h[u] - 1) // (h[u] - h[v]) + 1
# 2s + t >= Y
# max(L[v][t], (Y - t + 1) // 2
for t in range(2):
y = (Y - t + 1) // 2
L[v][t^1] = min(L[v][t^1], max(L[u][t] + t, y))
R[v][t^1] = max(R[v][t^1], R[u][t] + t)
# print(time)
# print(L)
# print(R)
return all(L[i][0] <= R[i][0] or L[i][1] <= R[i][1] for i in range(n))
ok = 10 ** 13
ng = -1
while ok - ng > 1:
mid = (ok + ng) // 2
res = check(mid)
# print(mid, res)
# print()
if res:
ok = mid
else:
ng = mid
return ok
for _ in range(int(input())):
n, m = map(int, input().split())
h = list(map(int, input().split()))
g = [[] for _ in range(n + 1)]
for _ in range(m):
u, v = map(int, input().split())
u -= 1
v -= 1
g[u].append(v)
g[v].append(u)
print(solve(n, g, h))