結果
| 問題 |
No.2096 Rage With Our Friends
|
| コンテスト | |
| ユーザー |
qwewe
|
| 提出日時 | 2025-04-24 12:30:51 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,136 bytes |
| コンパイル時間 | 425 ms |
| コンパイル使用メモリ | 82,168 KB |
| 実行使用メモリ | 593,792 KB |
| 最終ジャッジ日時 | 2025-04-24 12:32:04 |
| 合計ジャッジ時間 | 8,496 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 6 WA * 3 MLE * 1 -- * 17 |
ソースコード
import heapq
def main():
import sys
input = sys.stdin.read().split()
idx = 0
H = int(input[idx]); idx +=1
W = int(input[idx]); idx +=1
s_x = int(input[idx]); idx +=1
s_y = int(input[idx]); idx +=1
g_x = int(input[idx]); idx +=1
g_y = int(input[idx]); idx +=1
grid = []
for _ in range(H):
grid.append(input[idx])
idx +=1
# Precompute sorted_x for each column (1-based)
sorted_x = [[] for _ in range(W+1)] # columns 1..W
for y in range(1, W+1):
col = []
for x in range(1, H+1):
if grid[x-1][y-1] == '.':
col.append(x)
col.sort()
sorted_x[y] = col
# Initialize max_E: max_E[x][y] is a dictionary mapping k to max E
max_E = [[dict() for _ in range(W+1)] for _ in range(H+1)]
heap = []
initial_k = 0
initial_e = 0
heapq.heappush(heap, (initial_k, -initial_e, s_x, s_y))
max_E[s_x][s_y][initial_k] = initial_e
found = False
while heap:
k, neg_e, x, y = heapq.heappop(heap)
current_e = -neg_e
# Check if this state is outdated
if max_E[x][y].get(k, -1) > current_e:
continue
# Check if reached goal
if x == g_x and y == g_y:
print(k)
found = True
break
# Generate possible moves
for is_boost in [False, True]:
new_k = k + (1 if is_boost else 0)
# Calculate max_x based on jump type
if is_boost:
max_x_jump = x + 1 + current_e
else:
max_x_jump = x + 1 + (current_e // 2)
actual_max_x = min(max_x_jump, H)
for dy in [-1, 1]:
new_y = y + dy
if new_y < 1 or new_y > W:
continue
# Find the largest x' <= actual_max_x in sorted_x[new_y]
col = sorted_x[new_y]
if not col:
continue
# Binary search for the largest x' <= actual_max_x
left, right = 0, len(col)-1
best_x = -1
while left <= right:
mid = (left + right) // 2
if col[mid] <= actual_max_x:
best_x = col[mid]
left = mid + 1
else:
right = mid - 1
if best_x == -1:
continue
new_x = best_x
new_e = max(0, x - new_x)
# Check if new_k is within possible bounds (H is upper limit)
if new_k > H:
continue
# Check if this new state is better
current_max_e = max_E[new_x][new_y].get(new_k, -1)
if new_e > current_max_e:
max_E[new_x][new_y][new_k] = new_e
heapq.heappush(heap, (new_k, -new_e, new_x, new_y))
if not found:
print(-1)
if __name__ == "__main__":
main()
qwewe