結果
| 問題 | No.2376 障害物競プロ |
| コンテスト | |
| ユーザー |
detteiuu
|
| 提出日時 | 2026-07-18 19:54:48 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 1,183 ms / 4,000 ms |
| + 397µs | |
| コード長 | 1,515 bytes |
| 記録 | |
| コンパイル時間 | 711 ms |
| コンパイル使用メモリ | 96,104 KB |
| 実行使用メモリ | 114,320 KB |
| 最終ジャッジ日時 | 2026-07-18 19:56:00 |
| 合計ジャッジ時間 | 57,109 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 40 |
ソースコード
from sys import stdin
input = stdin.readline
def judge(ax, ay, bx, by, cx, cy, dx, dy):
def func(a, b, c, d):
return min(a, b) > max(c, d) or max(a, b) < min(c, d)
if func(ax, bx, cx, dx) or func(ay, by, cy, dy):
return False
s = (ax-bx)*(cy-ay)-(ay-by)*(cx-ax)
t = (ax-bx)*(dy-ay)-(ay-by)*(dx-ax)
if s*t > 0:
return False
s = (cx-dx)*(ay-cy)-(cy-dy)*(ax-cx)
t = (cx-dx)*(by-cy)-(cy-dy)*(bx-cx)
if s*t > 0:
return False
return True
def distance(x1, y1, x2, y2):
return ((x2-x1)**2 + (y2-y1)**2) ** 0.5
INF = 1<<60
N, M = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(N)]
query = [list(map(int, input().split())) for _ in range(M)]
N *= 2
B = []
for a, b, c, d in A:
B.append((a, b))
B.append((c, d))
dist = [[INF]*N for _ in range(N)]
for i in range(N): dist[i][i] = 0
for i in range(N-1):
x1, y1 = B[i]
for j in range(i+1, N):
x2, y2 = B[j]
for k in range(0, N, 2):
if k//2 in [i//2, j//2]: continue
x3, y3, x4, y4 = *B[k], *B[k+1]
if judge(x1, y1, x2, y2, x3, y3, x4, y4):
break
else:
dist[i][j] = distance(x1, y1, x2, y2)
dist[j][i] = distance(x1, y1, x2, y2)
for k in range(N):
for i in range(N):
for j in range(N):
dist[i][j] = min(dist[i][j], dist[i][k]+dist[k][j])
for a, b, c, d in query:
s = (a-1)*2+(b-1)
t = (c-1)*2+(d-1)
print(dist[s][t])
detteiuu