結果
| 問題 |
No.1998 Manhattan Restaurant
|
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 21:11:05 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,870 bytes |
| コンパイル時間 | 406 ms |
| コンパイル使用メモリ | 81,920 KB |
| 実行使用メモリ | 77,268 KB |
| 最終ジャッジ日時 | 2025-06-12 21:12:50 |
| 合計ジャッジ時間 | 5,615 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 11 TLE * 1 -- * 19 |
ソースコード
import sys
def main():
input = sys.stdin.read().split()
idx = 0
N = int(input[idx])
idx += 1
points = []
a_list = []
b_list = []
for _ in range(N):
x = int(input[idx])
y = int(input[idx + 1])
idx += 2
a = x + y
b = x - y
points.append((a, b))
a_list.append(a)
b_list.append(b)
a_min = min(a_list)
a_max = max(a_list)
b_min = min(b_list)
b_max = max(b_list)
low = 0
high = 1 << 60
answer = 0
while low <= high:
mid = (low + high) // 2
if (a_max - a_min) <= 2 * mid and (b_max - b_min) <= 2 * mid:
answer = mid
high = mid - 1
continue
possible = False
for key in [lambda p: p[0], lambda p: p[1], lambda p: (p[0] + p[1]), lambda p: (p[0] - p[1])]:
sorted_points = sorted(points, key=key)
n = len(sorted_points)
prefix_a_min = [float('inf')] * (n + 1)
prefix_a_max = [-float('inf')] * (n + 1)
prefix_b_min = [float('inf')] * (n + 1)
prefix_b_max = [-float('inf')] * (n + 1)
for i in range(n):
prefix_a_min[i+1] = min(prefix_a_min[i], sorted_points[i][0])
prefix_a_max[i+1] = max(prefix_a_max[i], sorted_points[i][0])
prefix_b_min[i+1] = min(prefix_b_min[i], sorted_points[i][1])
prefix_b_max[i+1] = max(prefix_b_max[i], sorted_points[i][1])
suffix_a_min = [float('inf')] * (n + 1)
suffix_a_max = [-float('inf')] * (n + 1)
suffix_b_min = [float('inf')] * (n + 1)
suffix_b_max = [-float('inf')] * (n + 1)
for i in range(n-1, -1, -1):
suffix_a_min[i] = min(suffix_a_min[i+1], sorted_points[i][0])
suffix_a_max[i] = max(suffix_a_max[i+1], sorted_points[i][0])
suffix_b_min[i] = min(suffix_b_min[i+1], sorted_points[i][1])
suffix_b_max[i] = max(suffix_b_max[i+1], sorted_points[i][1])
for i in range(n + 1):
left_a_range = prefix_a_max[i] - prefix_a_min[i]
left_b_range = prefix_b_max[i] - prefix_b_min[i]
right_a_range = suffix_a_max[i] - suffix_a_min[i]
right_b_range = suffix_b_max[i] - suffix_b_min[i]
if left_a_range <= 2 * mid and left_b_range <= 2 * mid and right_a_range <= 2 * mid and right_b_range <= 2 * mid:
possible = True
break
if possible:
break
if possible:
answer = mid
high = mid - 1
else:
low = mid + 1
print(answer)
if __name__ == '__main__':
main()
gew1fw