結果
問題 |
No.3116 More and more teleporter
|
ユーザー |
|
提出日時 | 2025-04-18 21:28:42 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 1,493 ms / 2,000 ms |
コード長 | 2,293 bytes |
コンパイル時間 | 307 ms |
コンパイル使用メモリ | 12,288 KB |
実行使用メモリ | 49,568 KB |
最終ジャッジ日時 | 2025-04-18 21:29:00 |
合計ジャッジ時間 | 13,945 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
ソースコード
import sys class SegmentTree: def __init__(self, data_size, init_val): self.n = 1 while self.n < data_size: self.n <<= 1 self.size = self.n self.data = [init_val] * (2 * self.n) self.init_val = init_val def update(self, pos, val): pos += self.n - 1 # Convert to 0-based index in the array if self.data[pos] <= val: return # No need to update if existing value is better self.data[pos] = val while pos > 1: pos >>= 1 new_val = min(self.data[2 * pos], self.data[2 * pos + 1]) if self.data[pos] == new_val: break self.data[pos] = new_val def query_min(self, l, r): res = self.init_val l += self.n - 1 r += self.n - 1 while l <= r: if l % 2 == 1: res = min(res, self.data[l]) l += 1 if r % 2 == 0: res = min(res, self.data[r]) r -= 1 l >>= 1 r >>= 1 return res def main(): input = sys.stdin.read().split() ptr = 0 N = int(input[ptr]) ptr += 1 Q = int(input[ptr]) ptr += 1 INF = 1 << 60 min_c = [INF] * (N + 2) left_tree = SegmentTree(N, INF) right_tree = SegmentTree(N, INF) output = [] for _ in range(Q): parts = input[ptr:ptr+3] if parts[0] == '1': x = int(parts[1]) ptr += 2 walk_cost = x - 1 min_left = left_tree.query_min(1, x) min_right = right_tree.query_min(x, N) candidates = [walk_cost] if min_left < INF: candidates.append(min_left + x) if min_right < INF: candidates.append(min_right - x) res = min(candidates) output.append(str(res)) else: x = int(parts[1]) c = int(parts[2]) ptr += 3 if c < min_c[x]: min_c[x] = c left_val = c - x right_val = c + x left_tree.update(x, left_val) right_tree.update(x, right_val) print('\n'.join(output)) if __name__ == "__main__": main()