結果
| 問題 |
No.3116 More and more teleporter
|
| コンテスト | |
| ユーザー |
Koi
|
| 提出日時 | 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)
Koi