結果
| 問題 | No.3652 Range Bracket Sequence |
| コンテスト | |
| ユーザー |
とある理系大学生の日常
|
| 提出日時 | 2026-07-30 11:53:54 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
TLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 2,708 bytes |
| 記録 | |
| コンパイル時間 | 297 ms |
| コンパイル使用メモリ | 95,720 KB |
| 実行使用メモリ | 120,960 KB |
| 最終ジャッジ日時 | 2026-08-28 21:12:38 |
| 合計ジャッジ時間 | 27,727 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 46 TLE * 11 |
ソースコード
class Lazy_segment_tree:#区間加算MIN用
__slots__=("N","A","Lazy")
def __init__(self,N:int,A:list):#要素が2^N個の遅延伝播セグ木を作る
self.A=[0]*(1<<(N+1))
self.Lazy=[0]*(1<<(N+1))
self.N=N
for n in range(len(A)):
self.A[n+(1<<self.N)]=A[n]
for n in range((1<<self.N)-1,0,-1):
self.Update(n)
def add(self,L:int,R:int,x:int):#[L,R]にx加算する(減算もできる)
self.add2(L,R,x,1,0)
def add2(self,L,R,x,n,d):#LからRの現在の地点はnで深さはd
LL=(n-(1<<d))*((1<<(self.N-d)))
RL=LL+(1<<(self.N-d))-1
M=(LL+RL+1)//2
if L==LL and R==RL:
self.Lazy[n]+=x
elif R<=M-1:
self.Propagate(n)
self.add2(L,R,x,n*2,d+1)
self.Update(n)
elif M<=L:
self.Propagate(n)
self.add2(L,R,x,n*2+1,d+1)
self.Update(n)
else:
self.Propagate(n)
self.add2(L,M-1,x,n*2,d+1)
self.add2(M,R,x,n*2+1,d+1)
self.Update(n)
def Update(self,n):
self.A[n]=self.F(self.A[2*n]+self.Lazy[2*n],self.A[2*n+1]+self.Lazy[2*n+1])
def F(self,a,b):
return min(a,b)
def Propagate(self,n):
self.Lazy[2*n]+=self.Lazy[n]
self.Lazy[2*n+1]+=self.Lazy[n]
self.A[n]+=self.Lazy[n]
self.Lazy[n]=0
def query(self,L,R):#[L,R]の区間クエリ
return self.query2(L,R,1,0)
def query2(self,L,R,n,d):
LL=(n-(1<<d))*((1<<(self.N-d)))
RL=LL+(1<<(self.N-d))-1
M=(LL+RL+1)//2
if L==LL and R==RL:
return self.A[n]+self.Lazy[n]
elif R<=M-1:
self.Propagate(n)
return self.query2(L,R,n*2,d+1)
elif M<=L:
self.Propagate(n)
return self.query2(L,R,n*2+1,d+1)
else:
self.Propagate(n)
return self.F(self.query2(L,M-1,n*2,d+1),self.query2(M,R,n*2+1,d+1))
N,Q=map(int,input().split())
S=input()
A=[]
D=[]
B=0
for n in range(N):
if S[n]=="(":
B+=1
D.append(1)
else:
D.append(2)
B-=1
A.append(B)
C=Lazy_segment_tree(18,A)
for q in range(Q):
A=list(map(int,input().split()))
if A[0]==1:
if A[2]==1:
if D[A[1]-1]==2:
C.add(A[1]-1,N,2)
D[A[1]-1]=1
else:
if D[A[1]-1]==1:
C.add(A[1]-1,N,-2)
D[A[1]-1]=2
else:
if A[1] == 1:
a = 0
else:
a = C.query(A[1]-1-1,A[1]-1-1)
print((A[2]-A[1]+1)-((C.query(A[2]-1,A[2]-1))-a)-2*(max(0,a-C.query(A[1]-1, A[2]-1))))
とある理系大学生の日常