結果
| 問題 |
No.2436 Min Diff Distance
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 14:17:00 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 4,040 bytes |
| コンパイル時間 | 354 ms |
| コンパイル使用メモリ | 82,356 KB |
| 実行使用メモリ | 157,196 KB |
| 最終ジャッジ日時 | 2025-06-12 14:17:39 |
| 合計ジャッジ時間 | 4,311 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 7 WA * 6 TLE * 10 |
ソースコード
import bisect
def main():
import sys
input = sys.stdin.read
data = input().split()
N = int(data[0])
points = []
idx = 1
u = []
v = []
for i in range(N):
x = int(data[idx])
y = int(data[idx+1])
idx += 2
points.append((x, y))
u_val = x + y
v_val = x - y
u.append(u_val)
v.append(v_val)
# Precompute sorted_u and sorted_v
sorted_u = sorted([(u[i], i) for i in range(N)], key=lambda x: (x[0], x[1]))
sorted_v = sorted([(v[i], i) for i in range(N)], key=lambda x: (x[0], x[1]))
# Function to compute max and min info
def get_max_min_info(arr):
sorted_desc = sorted(arr, reverse=True)
max1 = sorted_desc[0]
count_max1 = 1
i = 1
while i < len(sorted_desc) and sorted_desc[i] == max1:
count_max1 += 1
i += 1
max2 = sorted_desc[i] if i < len(sorted_desc) else -float('inf')
sorted_asc = sorted(arr)
min1 = sorted_asc[0]
count_min1 = 1
i = 1
while i < len(sorted_asc) and sorted_asc[i] == min1:
count_min1 += 1
i += 1
min2 = sorted_asc[i] if i < len(sorted_asc) else float('inf')
return (max1, count_max1, max2), (min1, count_min1, min2)
(max_u_info, min_u_info) = get_max_min_info(u)
(max_v_info, min_v_info) = get_max_min_info(v)
max1_u, count_max1_u, max2_u = max_u_info
min1_u, count_min1_u, min2_u = min_u_info
max1_v, count_max1_v, max2_v = max_v_info
min1_v, count_min1_v, min2_v = min_v_info
K = 5
min_P = float('inf')
for i in range(N):
current_u = u[i]
current_v = v[i]
# Compute max_chebyshev_i
# For u
if current_u == max1_u:
if count_max1_u > 1:
max_u_excl = max1_u
else:
max_u_excl = max2_u
else:
max_u_excl = max1_u
if current_u == min1_u:
if count_min1_u > 1:
min_u_excl = min1_u
else:
min_u_excl = min2_u
else:
min_u_excl = min1_u
a = max_u_excl - current_u
b = current_u - min_u_excl
# For v
if current_v == max1_v:
if count_max1_v > 1:
max_v_excl = max1_v
else:
max_v_excl = max2_v
else:
max_v_excl = max1_v
if current_v == min1_v:
if count_min1_v > 1:
min_v_excl = min1_v
else:
min_v_excl = min2_v
else:
min_v_excl = min1_v
c = max_v_excl - current_v
d = current_v - min_v_excl
max_chebyshev = max(a, b, c, d)
# Compute min_chebyshev
min_dist = float('inf')
# Check in sorted_u
target = (current_u, i)
pos = bisect.bisect_left(sorted_u, target)
start = max(0, pos - K)
end = min(len(sorted_u), pos + K + 1)
for j in range(start, end):
other_u, other_i = sorted_u[j]
if other_i == i:
continue
dist = max(abs(current_u - other_u), abs(current_v - v[other_i]))
if dist < min_dist:
min_dist = dist
# Check in sorted_v
target_v = (current_v, i)
pos_v = bisect.bisect_left(sorted_v, target_v)
start_v = max(0, pos_v - K)
end_v = min(len(sorted_v), pos_v + K + 1)
for j in range(start_v, end_v):
other_v, other_i = sorted_v[j]
if other_i == i:
continue
dist = max(abs(current_u - u[other_i]), abs(current_v - other_v))
if dist < min_dist:
min_dist = dist
P_i = max_chebyshev - min_dist
if P_i < min_P:
min_P = P_i
print(min_P)
if __name__ == "__main__":
main()
gew1fw