結果
| 問題 |
No.2366 登校
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-04-16 16:46:41 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,568 bytes |
| コンパイル時間 | 576 ms |
| コンパイル使用メモリ | 81,500 KB |
| 実行使用メモリ | 80,400 KB |
| 最終ジャッジ日時 | 2025-04-16 16:49:12 |
| 合計ジャッジ時間 | 2,989 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 17 WA * 8 |
ソースコード
import heapq
def main():
import sys
input = sys.stdin.read().split()
idx = 0
N = int(input[idx]); idx +=1
M = int(input[idx]); idx +=1
K = int(input[idx]); idx +=1
T = int(input[idx]); idx +=1
mysterious = dict()
for _ in range(K):
A = int(input[idx])-1; idx +=1
B = int(input[idx])-1; idx +=1
C = int(input[idx]); idx +=1
D = int(input[idx]); idx +=1
mysterious[(A,B)] = (C, D)
start = (0, 0)
end = (N-1, M-1)
# Dijkstra's priority queue: (fatigue, current_time, i, j)
heap = []
heapq.heappush(heap, (0, 0, start[0], start[1]))
# For each cell, keep a list of (fatigue, time) sorted by fatigue
# To check if a new state is not dominated
cell_states = [[dict() for _ in range(M)] for _ in range(N)]
cell_states[start[0]][start[1]][0] = 0
found = False
answer = -1
dirs = [(-1,0), (1,0), (0,-1), (0,1)]
while heap:
f, t, i, j = heapq.heappop(heap)
if (i, j) == end:
if t <= T:
answer = f
found = True
break
else:
continue
if cell_states[i][j].get(f, float('inf')) < t:
continue
# Move to adjacent cells
for di, dj in dirs:
ni = i + di
nj = j + dj
if 0 <= ni < N and 0 <= nj < M:
new_t = t + 1
new_f = f
if new_t > T:
continue
# Check if this state is dominated
add = True
to_remove = []
current_fatigues = cell_states[ni][nj]
for existing_f in list(current_fatigues.keys()):
existing_t = current_fatigues[existing_f]
if existing_f <= new_f and existing_t <= new_t:
add = False
break
if existing_f >= new_f and existing_t >= new_t:
to_remove.append(existing_f)
if add:
for fr in to_remove:
del current_fatigues[fr]
if new_f not in current_fatigues or new_t < current_fatigues.get(new_f, float('inf')):
current_fatigues[new_f] = new_t
heapq.heappush(heap, (new_f, new_t, ni, nj))
# Use mysterious square if present
if (i, j) in mysterious:
C, D = mysterious[(i,j)]
new_t = t + (2 - C)
new_f = f + D
if new_t > T:
continue
# Check if this state is dominated
add = True
to_remove = []
current_fatigues = cell_states[i][j]
for existing_f in list(current_fatigues.keys()):
existing_t = current_fatigues[existing_f]
if existing_f <= new_f and existing_t <= new_t:
add = False
break
if existing_f >= new_f and existing_t >= new_t:
to_remove.append(existing_f)
if add:
for fr in to_remove:
if fr in current_fatigues:
del current_fatigues[fr]
if new_f not in current_fatigues or new_t < current_fatigues.get(new_f, float('inf')):
current_fatigues[new_f] = new_t
heapq.heappush(heap, (new_f, new_t, i, j))
print(answer if found else -1)
if __name__ == "__main__":
main()
lam6er