結果
| 問題 | No.2743 Twisted Lattice |
| コンテスト | |
| ユーザー |
detteiuu
|
| 提出日時 | 2026-10-03 15:43:54 |
| 言語 | PyPy3 (7.3.23 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 843 ms / 3,000 ms |
| + 481µs | |
| コード長 | 2,418 bytes |
| 記録 | |
| コンパイル時間 | 71 ms |
| コンパイル使用メモリ | 81,792 KB |
| 実行使用メモリ | 316,504 KB |
| 最終ジャッジ日時 | 2026-10-03 15:44:05 |
| 合計ジャッジ時間 | 10,737 ms |
|
ジャッジサーバーID (参考情報) |
judge4_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 8 |
ソースコード
from sys import stdin
input = stdin.readline
from collections import defaultdict
from bisect import bisect_left, bisect_right
class Top2:
def __init__(self):
self.best1 = (INF, -1)
self.best2 = (INF, -1)
def add(self, val, genre):
b1v, b1g = self.best1
b2v, b2g = self.best2
if genre == b1g:
if val < b1v:
self.best1 = (val, genre)
else:
if val < b1v:
self.best2 = self.best1
self.best1 = (val, genre)
elif val < b2v:
self.best2 = (val, genre)
def get_exclude(self, genre):
if self.best1[1] != genre:
return self.best1[0]
else:
return self.best2[0]
INF = 1<<60
H, W, N = map(int, input().split())
AB = [list(map(int, input().split())) for _ in range(N)]
D = defaultdict(lambda : Top2())
E = defaultdict(list)
for i, (A, B) in enumerate(AB):
D[B].add(A-1, i)
E[B].append(A)
for key in E.keys():
E[key].sort()
F = sorted(D.keys())
L = [Top2() for _ in range(len(F))]
for i, key in enumerate(F):
L[i].add(*D[key].best1)
L[i].add(*D[key].best2)
if 1 <= i:
L[i].add(L[i-1].best1[0]+(F[i]-F[i-1]), L[i-1].best1[1])
L[i].add(L[i-1].best2[0]+(F[i]-F[i-1]), L[i-1].best2[1])
R = [Top2() for _ in range(len(F))]
for i in reversed(range(len(F))):
key = F[i]
R[i].add(*D[key].best1)
R[i].add(*D[key].best2)
if i+1 < len(F):
R[i].add(R[i+1].best1[0]+(F[i+1]-F[i]), R[i+1].best1[1])
R[i].add(R[i+1].best2[0]+(F[i+1]-F[i]), R[i+1].best2[1])
M = [Top2() for _ in range(len(F))]
for i in range(len(F)):
M[i].add(*L[i].best1)
M[i].add(*L[i].best2)
M[i].add(*R[i].best1)
M[i].add(*R[i].best2)
for i, (A, B) in enumerate(AB):
ans = INF
b = bisect_left(F, B)
if b < len(F):
ans = min(ans, M[b].get_exclude(i)+(A-1)+(F[b]-B))
if 1 <= b:
ans = min(ans, M[b-1].get_exclude(i)+(A-1)+(B-F[b-1]))
b = bisect_left(E[B], A)
if 1 <= b:
ans = min(ans, A-E[B][b-1])
if b+1 < len(E[B]):
ans = min(ans, E[B][b+1]-A)
b = bisect_left(E[B-1], A)
if 1 <= b:
ans = min(ans, A)
if b < len(E[B-1]):
ans = min(ans, E[B-1][b])
b = bisect_left(E[B+1], A)
if 1 <= b:
ans = min(ans, A)
if b < len(E[B+1]):
ans = min(ans, E[B+1][b])
print(ans)
detteiuu