結果
問題 | No.1998 Manhattan Restaurant |
ユーザー |
![]() |
提出日時 | 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()