結果
| 問題 |
No.1393 Median of Walk
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 20:48:30 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,083 bytes |
| コンパイル時間 | 233 ms |
| コンパイル使用メモリ | 81,920 KB |
| 実行使用メモリ | 267,136 KB |
| 最終ジャッジ日時 | 2025-06-12 20:50:51 |
| 合計ジャッジ時間 | 6,668 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | TLE * 2 -- * 37 |
ソースコード
import sys
from collections import deque
def main():
input = sys.stdin.read().split()
ptr = 0
N = int(input[ptr])
ptr += 1
M = int(input[ptr])
ptr += 1
adj = [[] for _ in range(N + 1)]
all_weights = []
for _ in range(M):
u = int(input[ptr])
ptr += 1
v = int(input[ptr])
ptr += 1
w = int(input[ptr])
ptr += 1
adj[u].append((v, w))
all_weights.append(w)
if not all_weights:
sorted_weights = []
else:
sorted_weights = sorted(list(set(all_weights)))
def check(w, target_node):
max_k = 2000 # Increased to handle longer paths
max_c = [{} for _ in range(N + 1)]
max_c[1][0] = 0
queue = deque()
queue.append((1, 0))
while queue:
u, k = queue.popleft()
if k > max_k:
continue
current_c = max_c[u].get(k, -1)
if current_c == -1:
continue
for edge in adj[u]:
v, w_e = edge
new_k = k + 1
if new_k > max_k:
continue
added_c = 1 if w_e <= w else 0
new_c = current_c + added_c
if new_k not in max_c[v] or new_c > max_c[v].get(new_k, -1):
max_c[v][new_k] = new_c
queue.append((v, new_k))
if target_node > N:
return False
target_max_c = max_c[target_node]
for k in target_max_c:
if target_max_c[k] >= (k + 1) // 2:
return True
return False
for i in range(2, N + 1):
left = 0
right = len(sorted_weights) - 1
answer = -1
while left <= right:
mid = (left + right) // 2
current_w = sorted_weights[mid]
if check(current_w, i):
answer = current_w
right = mid - 1
else:
left = mid + 1
print(answer if answer != -1 else -1)
if __name__ == '__main__':
main()
gew1fw