結果

問題 No.1868 Teleporting Cyanmond
ユーザー flora
提出日時 2022-03-11 22:32:16
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 216 ms / 2,000 ms
コード長 7,799 bytes
コンパイル時間 623 ms
コンパイル使用メモリ 82,432 KB
実行使用メモリ 96,256 KB
最終ジャッジ日時 2024-09-16 02:54:44
合計ジャッジ時間 5,572 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 25
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#
# stack
# node2
# node2identityidentityquery
    
#
# 1-indexed0-indexed1
    -indexedindexbit1
    -indexed
# 使operator
"""
operator=min, identity=float('inf')
operator=max, identity = -float('inf')
operator=lambda x, y: x + y,identity = 0
operator=lambda x, y: x * y, identity = 1
operator=math.gcd, identity = 0
update(k,x)x
operator=lambda A, B: [a+b for a,b in zip(A,B)]
"""
# O(N),update O(log(N)),query O(log(N))
class SegmentTree:
# O(N)
# RMQoperator
def __init__(self, A, operator=min):
"""
A:
operator:
identity:operator
"""
# 1-indexnode i:i//2,:2*i,:2*i+1
# bit:i>>1,:i<<1,i<<1|1
#
#
self.N = len(A)
# operator
self.operator = operator
# 2N-1identity2*NN+N
self.tree = [None] * (self.N + self.N)
# treeNA
for i, a in enumerate(A, self.N):
self.tree[i] = a
# operatorindex
for i in range(self.N - 1, 0, -1):
# [1,N-1]operator
self.tree[i] = self.operator(
self.tree[i << 1], self.tree[i << 1 | 1])
# O(log(N))
# AkA[k]x
def update(self, k, x):
# A[k]tree[k+self.N]root
k += self.N
#
self.tree[k] = x
# rootk=1OK
while k > 1:
# index
k >>= 1
#
self.tree[k] = self.operator(
self.tree[k << 1], self.tree[k << 1 | 1])
# O(log(N))
# [left,right)operator
# left,rightNoneleft=None
def query(self, left, right):
if left is None:
left = 0
if right is None:
right = self.N
# left,righttreeindex
left += self.N
right += self.N
#
vl = None
vr = None
# leafroot[2]
# [left,right)leftright
while left < right:
if left & 1:
# left
if vl is None:
#
vl = self.tree[left]
else:
#
vl = self.operator(vl, self.tree[left])
# L
left += 1
if right & 1:
# right-1
right -= 1
if vr is None:
vr = self.tree[right]
else:
#
vr = self.operator(self.tree[right], vr)
#
left >>= 1
right >>= 1
# vlvrNoneNoneNoneNone
if vl is None and vr is None:
return None
elif vl is None:
return vr
elif vr is None:
return vl
else:
#
return self.operator(vl, vr)
# O(log(N))
# AkA[k]xA[k]+=x
# update
def add(self, k, x):
k += self.N
#
self.tree[k] += x
while k > 1:
k >>= 1
self.tree[k] = self.operator(
self.tree[k << 1], self.tree[k << 1 | 1])
# O(1)
# A[k]Ak
def get(self, k):
return self.tree[k + self.N]
# O(1)
# Aself.treeself.tree[self.N: 2*self.N]
#
def original_range(self):
return self.N, 2 * self.N
N=int(input())
R=list(map(lambda x:int(x)-1,input().split()))
#edge
#NDAG
#iN-1dist[i]
#調dist[i][i+1,R[i]]
#N-10inf
distseg=SegmentTree([float('inf')]*(N-1)+[0],operator=min)
for i in reversed(range(N-1)):
#iN-1
#[i+1,R[i]]OK
mindist=distseg.query(i+1,R[i]+1)
#mindist+1
distseg.update(i,mindist+1)
#0
print(distseg.get(0))
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0