結果
| 問題 |
No.2096 Rage With Our Friends
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 15:30:33 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,637 bytes |
| コンパイル時間 | 309 ms |
| コンパイル使用メモリ | 82,688 KB |
| 実行使用メモリ | 53,248 KB |
| 最終ジャッジ日時 | 2025-06-12 15:30:48 |
| 合計ジャッジ時間 | 7,911 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 TLE * 1 -- * 1 |
| other | -- * 27 |
ソースコード
import heapq
def main():
H, W = map(int, input().split())
s_x, s_y, g_x, g_y = map(int, input().split())
grid = []
for _ in range(H):
line = input().strip()
grid.append([c == '.' for c in line])
# Precompute farthest for each column
farthest = [[0] * (H + 2) for _ in range(W + 2)] # 1-based indexing
for j in range(1, W + 1):
current_max = 0
for x in range(1, H + 1):
if grid[x-1][j-1]:
current_max = x
farthest[j][x] = current_max
max_E = [[dict() for _ in range(W + 2)] for _ in range(H + 2)]
heap = []
start_x, start_y = s_x, s_y
start_k = 0
start_E = 0
max_E[start_x][start_y][start_k] = start_E
heapq.heappush(heap, (start_k, -start_E, start_x, start_y))
found = False
while heap:
current_k, neg_E, x, y = heapq.heappop(heap)
current_E = -neg_E
# Check if a better state was already processed
if current_k in max_E[x][y] and max_E[x][y][current_k] > current_E:
continue
if x == g_x and y == g_y:
print(current_k)
found = True
break
# Explore both jump types
for jump_type in ['normal', 'boost']:
if jump_type == 'normal':
x_max = x + 1 + (current_E // 2)
else:
x_max = x + 1 + current_E
if x_max > H:
x_max = H
for dy in [-1, 1]:
new_y = y + dy
if new_y < 1 or new_y > W:
continue
# Find the farthest x' <= x_max where grid[x'][new_y] is '.'
max_x_prime = farthest[new_y][x_max]
if max_x_prime == 0:
continue # No such x' found
new_E = max(0, x - max_x_prime)
new_k = current_k + 1 if jump_type == 'boost' else current_k
# Check if this state is better
if new_k not in max_E[max_x_prime][new_y] or new_E > max_E[max_x_prime][new_y].get(new_k, -1):
if new_k not in max_E[max_x_prime][new_y]:
max_E[max_x_prime][new_y][new_k] = new_E
else:
if new_E > max_E[max_x_prime][new_y][new_k]:
max_E[max_x_prime][new_y][new_k] = new_E
heapq.heappush(heap, (new_k, -new_E, max_x_prime, new_y))
if not found:
print(-1)
if __name__ == "__main__":
main()
gew1fw