結果
| 問題 | No.151 セグメントフィッシング |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-01-28 16:57:32 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 249 ms / 5,000 ms |
| コード長 | 3,167 bytes |
| 記録 | |
| コンパイル時間 | 255 ms |
| コンパイル使用メモリ | 82,304 KB |
| 実行使用メモリ | 82,104 KB |
| 最終ジャッジ日時 | 2026-01-28 16:57:38 |
| 合計ジャッジ時間 | 5,004 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 19 |
ソースコード
import sys
from typing import List, Tuple
def int1(x: str, /): return int(x) - 1
def input(): return sys.stdin.readline().rstrip('\n')
def dbg(*args, **kwargs):
print(*(repr(arg) for arg in args), *(f'{k}: {repr(v)}' for k, v in kwargs.items()), sep='; ', file=sys.stderr)
import abc, typing
class SegTree(metaclass=abc.ABCMeta):
T = typing.TypeVar('T')
@staticmethod
@abc.abstractmethod
def e() -> T:
raise NotImplementedError
@staticmethod
@abc.abstractmethod
def op(a: T, b: T) -> T:
raise NotImplementedError
def __len__(self):
return self._n
def __init__(self, param: typing.Union[int, typing.Iterable[T]]):
if type(param) == int:
self._n = param
else:
if type(param) != list:
param = list(param)
self._n = len(param)
if self._n == 0:
return
self._lg = (self._n - 1).bit_length()
self._arr = [self.e()] * (2 << self._lg)
if type(param) != int:
self._arr[1 << self._lg:(1 << self._lg) + self._n] = param
for i in range((1 << self._lg) - 1, 0, -1):
self._arr[i] = self.op(self._arr[i << 1], self._arr[(i << 1) | 1])
def set(self, i: int, v: T):
assert 0 <= i < self._n
i += 1 << self._lg
self._arr[i] = v
for h in range(1, self._lg + 1):
j = i >> h
self._arr[j] = self.op(self._arr[j << 1], self._arr[(j << 1) | 1])
def get(self, i: int):
assert 0 <= i < self._n
return self._arr[i + (1 << self._lg)]
def prod(self, l: int, r: int):
assert 0 <= l <= r <= self._n
l, r = (1 << self._lg) + l, (1 << self._lg) + r
sml = smr = self.e()
while l < r:
if l & 1:
sml = self.op(sml, self._arr[l])
l += 1
if r & 1:
r -= 1
smr = self.op(smr, self._arr[r])
l, r = l >> 1, r >> 1
return self.op(sml, smr)
class SumSegTree(SegTree):
@staticmethod
def e():
return 0
@staticmethod
def op(a, b):
return a + b
def main():
n, q = map(int, input().split())
s = SumSegTree(2 * n)
for t in range(1, q + 1):
x, y, z = input().split()
y, z = int(y), int(z)
if x == 'R':
pos = (y - t) % (2 * n)
orig = s.get(pos)
s.set(pos, orig + z)
elif x == 'L':
pos = (2 * n - 1 - y - t) % (2 * n)
orig = s.get(pos)
s.set(pos, orig + z)
else:
def get(fr, to):
if fr // (2 * n) != to // (2 * n):
return s.prod(fr % (2 * n), 2 * n) + s.prod(0, to % (2 * n))
else:
return s.prod(fr % (2 * n), to % (2 * n))
print(get(y - t, z - t) + get(2 * n - z - t, 2 * n - y - t))
def _start():
ret = main()
if ret is not None:
if isinstance(ret, List) or isinstance(ret, Tuple):
print(*ret)
else:
print(ret)
if __name__ == '__main__':
_start()