結果
| 問題 |
No.3208 Parse AND OR Affection
|
| コンテスト | |
| ユーザー |
遭難者
|
| 提出日時 | 2025-07-18 16:20:57 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,302 ms / 5,000 ms |
| コード長 | 2,700 bytes |
| コンパイル時間 | 355 ms |
| コンパイル使用メモリ | 82,844 KB |
| 実行使用メモリ | 144,244 KB |
| 最終ジャッジ日時 | 2025-07-18 16:21:16 |
| 合計ジャッジ時間 | 16,237 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 20 |
ソースコード
import sys
class SegTree:
def __init__(self, op, e, v):
self._op = op
self._e = e
self._n = len(v)
self._log = (self._n - 1).bit_length()
self._size = 1 << self._log
self._d = [self._e] * (2 * self._size)
for i in range(self._n):
self._d[self._size + i] = v[i]
for i in range(self._size - 1, 0, -1):
self._update(i)
def _update(self, k):
self._d[k] = self._op(self._d[2 * k], self._d[2 * k + 1])
def set(self, p, x):
p += self._size
self._d[p] = x
for i in range(1, self._log + 1):
self._update(p >> i)
def get(self, p):
return self._d[p + self._size]
def prod(self, l, r):
sml = self._e
smr = self._e
l += self._size
r += self._size
while l < r:
if l & 1:
sml = self._op(sml, self._d[l])
l += 1
if r & 1:
r -= 1
smr = self._op(self._d[r], smr)
l >>= 1
r >>= 1
return self._op(sml, smr)
ap = (
(0, 0, 3, 3),
(0, 1, 2, 3),
(0, 2, 1, 3),
(0, 3, 0, 3),
)
def op(l, r):
l_c0, l_c1, l_x, l_f, l_ans = l
r_c0, r_c1, r_x, r_f, r_ans = r
if r_f == -1: return l
if l_f == -1: return r
res_c0, res_c1 = r_c0, r_c1
if r_f in (0, 1): res_c0 += l_c0
else: res_c1 += l_c0
if r_f in (0, 2): res_c0 += l_c1
else: res_c1 += l_c1
res_x_list = list(l_x)
for k in range(4):
res_x_list[ap[l_f][k]] += r_x[k]
res_f = ap[l_f][r_f]
res_ans = l_ans + r_ans + l_c0 * (r_x[2] + r_x[3]) + l_c1 * (r_x[1] + r_x[3])
return (res_c0, res_c1, tuple(res_x_list), res_f, res_ans)
def identity_element():
return (0, 0, (0, 0, 0, 0), -1, 0)
def main():
input = sys.stdin.readline
n, que = map(int, input().split())
s_in = input().strip()
s = "+" + s_in
n_pairs = (n + 1) // 2
a = []
for i in range(n_pairs):
op_char, val_char = s[2 * i], s[2 * i + 1]
c0, c1, ans = 0, 0, 0
x = [0, 0, 0, 0]
f = 0
if op_char == '+': f = 3 if val_char == 'T' else 1
elif op_char == '*': f = 1 if val_char == 'T' else 0
else: f = 2 if val_char == 'T' else 1
x[f] += 1
if val_char == 'T': ans, c1 = 1, 1
else: c0 = 1
a.append((c0, c1, tuple(x), f, ans))
seg = SegTree(op, identity_element(), a)
for _ in range(que):
l, r = map(int, input().split())
l, r = (l - 1 + 1) // 2, (r + 1) // 2
res_tuple = seg.prod(l, r)
print(res_tuple[4])
if __name__ == "__main__":
main()
遭難者