結果
問題 | 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 typingimport sysinput = sys.stdin.readlinedef _ceil_pow2(n: int) -> int:x = 0while (1 << x) < n:x += 1return xclass SegTree:def __init__(self, op, e, lst):self.n = len(lst)self.N0 = 2 ** (self.n - 1).bit_length()self.op = opself.e = eself.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.N0self.data[i] = xwhile i > 1:i >>= 1self.data[i] = self.op(self.data[2 * i], self.data[2 * i + 1])def prod(self, l, r):if r <= l:return self.elres = self.erres = self.el += self.N0r += self.N0while l < r:if l & 1:lres = self.op(lres, self.data[l])l += 1if r & 1:r -= 1rres = self.op(self.data[r], rres)l >>= 1r >>= 1return self.op(lres, rres)INF = 1 << 60N, 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] = 0else:dp[i*4+j] = 1return 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]) - 1c = 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