結果
問題 | No.2366 登校 |
ユーザー |
![]() |
提出日時 | 2025-03-26 15:57:59 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 5,440 bytes |
コンパイル時間 | 329 ms |
コンパイル使用メモリ | 82,176 KB |
実行使用メモリ | 86,228 KB |
最終ジャッジ日時 | 2025-03-26 15:59:21 |
合計ジャッジ時間 | 4,011 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 18 WA * 7 |
ソースコード
import heapqdef main():n, m, k, T = map(int, input().split())myst = {}for _ in range(k):a, b, c, d = map(int, input().split())a -= 1b -= 1myst[(a, b)] = (c, d)start_i, start_j = 0, 0end_i, end_j = n - 1, m - 1best = {}heap = []initial_state = (start_i, start_j, True)best[initial_state] = {0: 0}heapq.heappush(heap, (0, start_i, start_j, True, 0))dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)]found = Falseanswer = -1while heap:sum_d, i, j, can_move, adj_time = heapq.heappop(heap)if i == end_i and j == end_j and adj_time <= T:answer = sum_dfound = Truebreakcurrent_key = (i, j, can_move)if current_key not in best:continuecurrent_best = best[current_key]if sum_d not in current_best or current_best[sum_d] < adj_time:continueif can_move:for di, dj in dirs:ni, nj = i + di, j + djif 0 <= ni < n and 0 <= nj < m:new_sum_d = sum_dnew_adj_time = adj_time + 1if new_adj_time > T:continuenew_key = (ni, nj, True)if new_key not in best:best[new_key] = {}entry = best[new_key]add = Trueremove = []for d_entry in list(entry.keys()):if d_entry <= new_sum_d and entry[d_entry] <= new_adj_time:add = Falsebreakif add:for d_entry in list(entry.keys()):if d_entry >= new_sum_d and entry[d_entry] >= new_adj_time:remove.append(d_entry)for d in remove:del entry[d]entry[new_sum_d] = new_adj_timeheapq.heappush(heap, (new_sum_d, ni, nj, True, new_adj_time))if (i, j) in myst:c, d = myst[(i, j)]new_sum_d = sum_d + dnew_adj_time = adj_time + 1 - cnew_can_move = Falseif new_adj_time > T:continuenew_key = (i, j, new_can_move)if new_key not in best:best[new_key] = {}entry = best[new_key]add = Trueremove = []for d_entry in list(entry.keys()):if d_entry <= new_sum_d and entry[d_entry] <= new_adj_time:add = Falsebreakif add:for d_entry in list(entry.keys()):if d_entry >= new_sum_d and entry[d_entry] >= new_adj_time:remove.append(d_entry)for d in remove:del entry[d]entry[new_sum_d] = new_adj_timeheapq.heappush(heap, (new_sum_d, i, j, new_can_move, new_adj_time))else:new_sum_d = sum_dnew_adj_time = adj_time + 1new_can_move = Trueif new_adj_time > T:continuenew_key = (i, j, new_can_move)if new_key not in best:best[new_key] = {}entry = best[new_key]add = Trueremove = []for d_entry in list(entry.keys()):if d_entry <= new_sum_d and entry[d_entry] <= new_adj_time:add = Falsebreakif add:for d_entry in list(entry.keys()):if d_entry >= new_sum_d and entry[d_entry] >= new_adj_time:remove.append(d_entry)for d in remove:del entry[d]entry[new_sum_d] = new_adj_timeheapq.heappush(heap, (new_sum_d, i, j, new_can_move, new_adj_time))if (i, j) in myst:c, d = myst[(i, j)]new_sum_d = sum_d + dnew_adj_time = adj_time + 1 - cnew_can_move = Falseif new_adj_time > T:continuenew_key = (i, j, new_can_move)if new_key not in best:best[new_key] = {}entry = best[new_key]add = Trueremove = []for d_entry in list(entry.keys()):if d_entry <= new_sum_d and entry[d_entry] <= new_adj_time:add = Falsebreakif add:for d_entry in list(entry.keys()):if d_entry >= new_sum_d and entry[d_entry] >= new_adj_time:remove.append(d_entry)for d in remove:del entry[d]entry[new_sum_d] = new_adj_timeheapq.heappush(heap, (new_sum_d, i, j, new_can_move, new_adj_time))print(answer if found else -1)if __name__ == "__main__":main()