結果
問題 |
No.3116 More and more teleporter
|
ユーザー |
![]() |
提出日時 | 2025-04-18 22:58:20 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 407 ms / 2,000 ms |
コード長 | 1,932 bytes |
コンパイル時間 | 695 ms |
コンパイル使用メモリ | 81,872 KB |
実行使用メモリ | 90,764 KB |
最終ジャッジ日時 | 2025-04-18 22:58:28 |
合計ジャッジ時間 | 7,025 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
ソースコード
class DualSegTree: def __init__(self,N,A,op,e) -> None: #N:数列の長さ #A:数列の初期状態 #op:区間更新の写像 #e:∀a,op(a,e)=aとなる単位元e size=1 log_size=1 while size<N: size*=2 log_size+=1 #size:セグ木の横の大きさ #log_size:セグ木の深さ(?) self.size=size self.log_size=log_size self.op=op self.e=e self.tree=[e for _ in range(2*size)] for i in range(N): self.tree[size+i]=A[i] #seg_treeを深さ順に出力 #時間計算量O(N) def print_seg_tree(self): for i in range(self.log_size): print(self.tree[2**i:2**(i+1)]) #Aのi番目(0-indexed)の要素を遅延とかを適用しながら取得する #時間計算量O(logN) def get(self,i): i+=self.size ans=self.tree[i] while i>1: i=i//2 ans=self.op(ans,self.tree[i]) return ans #Aの[l,r)をop(A[i],x)で更新する(実際にはせず遅延に色々する) #時間計算量O(logN) def update(self,l,r,x): l+=self.size r+=self.size while l<r: if(l%2==1): self.tree[l]=self.op(self.tree[l],x) l+=1 if(r%2==1): self.tree[r-1]=self.op(self.tree[r-1],x) r-=1 l=l//2 r=r//2 N,Q=map(int,input().split()) DST0=DualSegTree(N,[0] * N, min, 10 ** 9) DST1=DualSegTree(N,[N] * N, min, 10 ** 9) ans=[] for i in range(Q): query=list(map(int,input().split())) if(query[0]==1): x = query[1] - 1 ans.append(min(x + DST0.get(x), N - 1 - x + DST1.get(x))) else: x = query[1] - 1 c = query[2] DST0.update(x, N, c - x) DST1.update(0, x + 1, c - (N - 1 - x)) for a in ans: print(a)