結果
問題 | No.2992 Range ABCD String Query |
ユーザー |
![]() |
提出日時 | 2024-12-17 01:29:05 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,301 bytes |
コンパイル時間 | 391 ms |
コンパイル使用メモリ | 82,424 KB |
実行使用メモリ | 405,944 KB |
最終ジャッジ日時 | 2024-12-17 01:33:21 |
合計ジャッジ時間 | 247,521 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 2 WA * 9 TLE * 30 |
ソースコード
import typingdef _ceil_pow2(n: int) -> int:x = 0while (1 << x) < n:x += 1return xdef _bsf(n: int) -> int:x = 0while n % 2 == 0:x += 1n //= 2return xclass SegTree:def __init__(self,op: typing.Callable[[typing.Any, typing.Any], typing.Any],e: typing.Any,v: typing.Union[int, typing.List[typing.Any]]) -> None:self._op = opself._e = eif isinstance(v, int):v = [e] * vself._n = len(v)self._log = _ceil_pow2(self._n)self._size = 1 << self._logself._d = [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 set(self, p: int, x: typing.Any) -> None:p += self._sizeself._d[p] = xfor i in range(1, self._log + 1):self._update(p >> i)def get(self, p: int) -> typing.Any:return self._d[p + self._size]def prod(self, left: int, right: int) -> typing.Any:sml = self._esmr = self._eleft += self._sizeright += self._sizewhile left < right:if left & 1:sml = self._op(sml, self._d[left])left += 1if right & 1:right -= 1smr = self._op(self._d[right], smr)left >>= 1right >>= 1return self._op(sml, smr)def all_prod(self) -> typing.Any:return self._d[1]def max_right(self, left: int,f: typing.Callable[[typing.Any], bool]) -> int:if left == self._n:return self._nleft += self._sizesm = self._efirst = Truewhile first or (left & -left) != left:first = Falsewhile left % 2 == 0:left >>= 1if not f(self._op(sm, self._d[left])):while left < self._size:left *= 2if f(self._op(sm, self._d[left])):sm = self._op(sm, self._d[left])left += 1return left - self._sizesm = self._op(sm, self._d[left])left += 1return self._ndef min_left(self, right: int,f: typing.Callable[[typing.Any], bool]) -> int:if right == 0:return 0right += self._sizesm = self._efirst = Truewhile first or (right & -right) != right:first = Falseright -= 1while right > 1 and right % 2:right >>= 1if not f(self._op(self._d[right], sm)):while right < self._size:right = 2 * right + 1if f(self._op(self._d[right], sm)):sm = self._op(self._d[right], sm)right -= 1return right + 1 - self._sizesm = self._op(self._d[right], sm)return 0def _update(self, k: int) -> None:self._d[k] = self._op(self._d[2 * k], self._d[2 * k + 1])n,q=map(int,input().split())s=input()#0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9#AA,AB,AC,AD,BB,BC,BD,CC,CD,DD]def base(x):if x=='A':return (0,n,n,n,1,n,n,1,n,1)elif x=='B':return (1,n,n,n,0,n,n,1,n,1)elif x=='C':return (1,n,n,n,1,n,n,0,n,1)else:return (1,n,n,n,1,n,n,1,n,0)a=[]for i in range(n):a.append(base(s[i]))def f(x,y):if not x:return yif not y:return xC_D=min(y[8],y[9])B_D=min(y[6],C_D)A_D=min(y[3],B_D)B_C=min(y[5],y[7])A_C=min(y[2],B_C)A_B=min(y[1],y[4])AA=x[0]+y[0]AB=min(x[0]+A_B,x[1]+y[4])AC=min(x[0]+A_C,x[1]+B_C,x[2]+x[7])AD=min(x[0]+A_D,x[1]+B_D,x[2]+C_D,x[3]+y[9])BB=x[4]+y[4]BC=min(x[4]+B_C,x[5]+y[7])BD=min(x[4]+B_D,x[5]+C_D,x[6]+y[9])CC=x[7]+y[7]CD=min(x[7]+C_D,x[8]+y[9])DD=x[9]+y[9]return (AA,AB,AC,AD,BB,BC,BD,CC,CD,DD)seg=SegTree(f,0,a)for _ in range(q):x=input().split()if x[0]=='1':seg.set(int(x[1])-1,base(x[2]))else:l,r=int(x[1])-1,int(x[2])print(min(seg.prod(l,r)))