結果
問題 |
No.1332 Range Nearest Query
|
ユーザー |
![]() |
提出日時 | 2025-03-31 17:28:06 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,830 ms / 2,500 ms |
コード長 | 1,811 bytes |
コンパイル時間 | 177 ms |
コンパイル使用メモリ | 82,652 KB |
実行使用メモリ | 293,164 KB |
最終ジャッジ日時 | 2025-03-31 17:29:23 |
合計ジャッジ時間 | 56,819 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 48 |
ソースコード
import bisect def main(): import sys input = sys.stdin.read().split() ptr = 0 N = int(input[ptr]) ptr += 1 X = list(map(int, input[ptr:ptr+N])) ptr += N Q = int(input[ptr]) ptr += 1 queries = [] for _ in range(Q): l = int(input[ptr]) r = int(input[ptr+1]) x = int(input[ptr+2]) queries.append((l-1, r-1, x)) # Convert to 0-based indices ptr += 3 # Build the segment tree size = 1 while size < N: size <<= 1 seg = [[] for _ in range(2 * size)] # Initialize leaves for i in range(N): seg[size + i] = [X[i]] # Merge non-leaf nodes for i in range(size - 1, 0, -1): left = seg[2 * i] right = seg[2 * i + 1] merged = [] l_ptr = r_ptr = 0 while l_ptr < len(left) and r_ptr < len(right): if left[l_ptr] < right[r_ptr]: merged.append(left[l_ptr]) l_ptr += 1 else: merged.append(right[r_ptr]) r_ptr += 1 merged += left[l_ptr:] merged += right[r_ptr:] seg[i] = merged # Process each query for l, r, x in queries: res = float('inf') a = l + size b = r + size nodes = [] while a <= b: if a % 2 == 1: nodes.append(seg[a]) a += 1 if b % 2 == 0: nodes.append(seg[b]) b -= 1 a >>= 1 b >>= 1 for arr in nodes: pos = bisect.bisect_left(arr, x) if pos < len(arr): res = min(res, abs(arr[pos] - x)) if pos > 0: res = min(res, abs(arr[pos - 1] - x)) print(res) if __name__ == "__main__": main()