問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
(はじめに)
問題 4 まででSegment Treeの構築をしてきました。
ここでは、問題 5,6 でSegment Treeの更新を行っていきます。
class SegTree():
def calc(self,a, b): #行いたい処理
return max(a, b)
def e(self): #単位元
return 0
def __init__(self, n, A):
#完全2分木を作る
#N = 2 ** k ≧ n となるようにする。(葉の数がnより多くなるようにする。)
self.k = (n - 1).bit_length() #bit_lengthメソッドにより取得が出来る。
N = 2 ** (self.k)
self.N = N
self.Tree = [self.e()] * (2 * N - 1)
#葉の部分に初期要素を入れる
for i in range(n):
self.Tree[N - 1 + i] = A[i]
#葉から近い順にそれぞれの葉以外の頂点の計算を行う
for i in range(N - 2, -1, -1):
self.Tree[i] = self.calc(self.Tree[2 * i + 1], self.Tree[2 * i + 2]) #頂点iの子は2i+1,2i+2、そこの2つを用いて計算を行う
def renewal(self, ind, x): #A[ind]をxに更新
#問題 5,6 で実装
def product(self, l, r): #A[l]からA[r]までの計算結果を返す
#問題 7,8,9 で実装


入力は以下のフォーマットで与えられます。
T
答えを 1 行で出力してください。
頂点番号 T の頂点と根の最短パス上の頂点を頂点番号の降順にすべて空白区切りで出力してください。
すべてのテストケースについて以下の条件を満たします。
10
10 4 1 0
100
100 49 24 11 5 2 0