結果
| 問題 |
No.1998 Manhattan Restaurant
|
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-20 20:39:21 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,431 bytes |
| コンパイル時間 | 142 ms |
| コンパイル使用メモリ | 82,768 KB |
| 実行使用メモリ | 242,620 KB |
| 最終ジャッジ日時 | 2025-03-20 20:39:34 |
| 合計ジャッジ時間 | 5,405 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 8 WA * 3 TLE * 1 -- * 19 |
ソースコード
def main():
import sys
input = sys.stdin.read
data = input().split()
idx = 0
N = int(data[idx])
idx +=1
points = []
for _ in range(N):
x = int(data[idx])
y = int(data[idx+1])
idx +=2
u = x + y
v = x - y
points.append((u, v))
if N <= 1:
print(0)
return
min_u = max_u = points[0][0]
min_v = max_v = points[0][1]
for u, v in points:
min_u = min(min_u, u)
max_u = max(max_u, u)
min_v = min(min_v, v)
max_v = max(max_v, v)
# Required D for one square
initial_D = max( (max_u - min_u) // 2, (max_v - min_v) // 2 )
low = 0
high = initial_D
def is_possible(D):
orders = [
(lambda p: p[0], False), # sorted by u ascending
(lambda p: -p[0], False), # sorted by u descending
(lambda p: p[1], False), # sorted by v ascending
(lambda p: -p[1], False) # sorted by v descending
]
for key_func, _ in orders:
sorted_points = sorted(points, key=key_func)
n = len(sorted_points)
# Precompute prefix min and max
prefix_min_u = [float('inf')] * (n +1)
prefix_max_u = [-float('inf')] * (n +1)
prefix_min_v = [float('inf')] * (n +1)
prefix_max_v = [-float('inf')] * (n +1)
for i in range(1, n+1):
u, v = sorted_points[i-1]
prefix_min_u[i] = min(prefix_min_u[i-1], u)
prefix_max_u[i] = max(prefix_max_u[i-1], u)
prefix_min_v[i] = min(prefix_min_v[i-1], v)
prefix_max_v[i] = max(prefix_max_v[i-1], v)
# Precompute suffix min and max
suffix_min_u = [float('inf')] * (n +1)
suffix_max_u = [-float('inf')] * (n +1)
suffix_min_v = [float('inf')] * (n +1)
suffix_max_v = [-float('inf')] * (n +1)
for i in range(n-1, -1, -1):
u, v = sorted_points[i]
suffix_min_u[i] = min(suffix_min_u[i+1], u)
suffix_max_u[i] = max(suffix_max_u[i+1], u)
suffix_min_v[i] = min(suffix_min_v[i+1], v)
suffix_max_v[i] = max(suffix_max_v[i+1], v)
# Check all possible splits
for i in range(n+1):
# Compute left group D
if i ==0:
left_du =0
left_dv =0
else:
left_du = (prefix_max_u[i] - prefix_min_u[i]) //2
left_dv = (prefix_max_v[i] - prefix_min_v[i]) //2
left_max = max(left_du, left_dv)
# Compute right group D
if i ==n:
right_du =0
right_dv =0
else:
right_du = (suffix_max_u[i] - suffix_min_u[i]) //2
right_dv = (suffix_max_v[i] - suffix_min_v[i]) //2
right_max = max(right_du, right_dv)
if left_max <= D and right_max <= D:
return True
return False
answer = high
while low <= high:
mid = (low + high) //2
if is_possible(mid):
answer = mid
high = mid -1
else:
low = mid +1
print(answer)
if __name__ == '__main__':
main()
lam6er