結果
問題 |
No.2992 Range ABCD String Query
|
ユーザー |
![]() |
提出日時 | 2024-12-24 20:11:54 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,373 bytes |
コンパイル時間 | 454 ms |
コンパイル使用メモリ | 81,536 KB |
実行使用メモリ | 359,056 KB |
最終ジャッジ日時 | 2024-12-24 20:14:51 |
合計ジャッジ時間 | 171,558 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 31 TLE * 10 |
ソースコード
import typing import sys input = sys.stdin.readline def _ceil_pow2(n: int) -> int: x = 0 while (1 << x) < n: x += 1 return x class SegTree: def __init__(self, op, e, lst): self.n = len(lst) self.N0 = 2 ** (self.n - 1).bit_length() self.op = op self.e = e self.data = [e] * (2 * self.N0) if type(lst) is list: for i in range(self.n): self.data[self.N0 + i] = lst[i] for i in range(self.N0 - 1, 0, -1): self.data[i] = self.op(self.data[2 * i], self.data[2 * i + 1]) def get(self, i): return self.data[self.N0 + i] def set(self, i, x): i += self.N0 self.data[i] = x while i > 1: i >>= 1 self.data[i] = self.op(self.data[2 * i], self.data[2 * i + 1]) def prod(self, l, r): if r <= l: return self.e lres = self.e rres = self.e l += self.N0 r += self.N0 while l < r: if l & 1: lres = self.op(lres, self.data[l]) l += 1 if r & 1: r -= 1 rres = self.op(self.data[r], rres) l >>= 1 r >>= 1 return self.op(lres, rres) INF = 1 << 60 N, Q = map(int, input().split()) S = input().strip() def identity(c): # dp = [[INF] * 4 for _ in range(4)] dp = [INF] * (4*4) k = ord(c) - ord('A') for i in range(4): for j in range(i, 4): if i <= k <= j: dp[i*4+j] = 0 else: dp[i*4+j] = 1 return dp # 二つの区間をマージ def op(a, b): # dp = [[INF] * 4 for _ in range(4)] dp = [INF] * (4*4) for i in range(4): for j in range(i, 4): for k in range(i, j+1): dp[i*4+j] = min(dp[i*4+j], a[i*4+k] + b[k*4+j]) return dp # e = [[0] * 4 for _ in range(4)] e = [0] * (4*4) segt = SegTree(op, e, [identity(c) for c in S]) for _ in range(Q): a = input().split() match a[0]: case '1': x = int(a[1]) - 1 c = a[2] segt.set(x, identity(c)) case '2': L, R = int(a[1])-1, int(a[2]) res = segt.prod(L, R) ans = min(res) print(ans) case _: assert False