結果
| 問題 |
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()