結果
問題 | No.318 学学学学学 |
ユーザー | hagebooi |
提出日時 | 2019-03-01 17:36:24 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 973 ms / 2,000 ms |
コード長 | 3,148 bytes |
コンパイル時間 | 389 ms |
コンパイル使用メモリ | 82,432 KB |
実行使用メモリ | 123,096 KB |
最終ジャッジ日時 | 2024-06-22 18:52:02 |
合計ジャッジ時間 | 10,965 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 153 ms
78,592 KB |
testcase_01 | AC | 210 ms
82,768 KB |
testcase_02 | AC | 266 ms
84,144 KB |
testcase_03 | AC | 188 ms
80,848 KB |
testcase_04 | AC | 219 ms
83,564 KB |
testcase_05 | AC | 902 ms
123,008 KB |
testcase_06 | AC | 635 ms
106,452 KB |
testcase_07 | AC | 490 ms
99,584 KB |
testcase_08 | AC | 353 ms
95,284 KB |
testcase_09 | AC | 251 ms
94,304 KB |
testcase_10 | AC | 161 ms
93,356 KB |
testcase_11 | AC | 973 ms
123,096 KB |
testcase_12 | AC | 558 ms
106,496 KB |
testcase_13 | AC | 471 ms
99,712 KB |
testcase_14 | AC | 349 ms
96,568 KB |
testcase_15 | AC | 256 ms
95,088 KB |
testcase_16 | AC | 186 ms
93,184 KB |
testcase_17 | AC | 527 ms
106,196 KB |
testcase_18 | AC | 415 ms
106,764 KB |
testcase_19 | AC | 485 ms
106,200 KB |
testcase_20 | AC | 160 ms
92,232 KB |
testcase_21 | AC | 37 ms
52,864 KB |
testcase_22 | AC | 39 ms
52,352 KB |
testcase_23 | AC | 36 ms
52,520 KB |
testcase_24 | AC | 37 ms
52,736 KB |
testcase_25 | AC | 39 ms
52,736 KB |
testcase_26 | AC | 40 ms
52,480 KB |
testcase_27 | AC | 39 ms
52,736 KB |
testcase_28 | AC | 36 ms
52,608 KB |
ソースコード
""" g(f(a, b), c) = f(g(a, c), g(b, c)) ...cを後から作用させても、先に作用させても結果は同じ。(両方に作用させることに注意) g(g(a, b), c) = g(a, h(b, c)) ...b, cを順番に作用させることはh(b,c)を一回作用させることと同じ。(計算の省略が可能) 例) 例えば区間の最大値を求める + 区間を変更するというクエリでは f(a, b) = max(a, b) (単位元は0) g(a, c) = c(ただしc = 0ならばa) g = h 今回は区間に対してはなにもしない + 区間を変更するというクエリである。 したがって f(a, b) = 0 g(a, c) = c(ただしc = 0ならばa) g = h とすれば良い。(最下段はfの影響を受けない。) """ class segtree: def __init__(self, n, L = None): self.raw_len = n self.list = L self.init() def init(self): N = 1 n = self.raw_len while N < n: N *= 2 self.len = N self.node = [0]*(2*N-1) self.lazy = [0]*(2*N-1) if self.list: for i in range(self.raw_len): self.node[i+self.len-1] = self.list[i] for i in range(self.len - 2, -1, -1): self.node[i] = 0 def update(self, i, x):#点更新 i += self.len - 1 self.node[i] = x while i > 0: i = (i-1)//2 self.node[i] = 0 def eval(self, k): if self.lazy[k] != 0: self.node[k] = self.lazy[k] if k < self.len - 1: #要編集。和なら半数伝播、minmaxなら全数伝播。 self.lazy[2*k+1] = self.lazy[k] self.lazy[2*k+2] = self.lazy[k] self.lazy[k] = 0 def range_update(self, a, b, x, k=0, l=0, r=None): if r == None: r = self.len self.eval(k) if r <= a or b <= l: return 0 if a <= l and r <= b: self.lazy[k] = x #max,minなら(r-l)は書かなくて良い self.eval(k) else: self.range_update(a, b, x, k*2+1, l, (l+r)//2) self.range_update(a, b, x, k*2+2, (l+r)//2, r) self.node[k] = 0 def query(self, a, b, k = 0, l = 0, r = None): if r == None: r = self.len if r <= a or b <= l: return 0 self.eval(k, l, r) if a <= l and r <= b: return self.node[k] else: vl = self.query(a, b, k*2+1, l, (l+r)//2) vr = self.query(a, b, k*2+2, (l+r)//2, r) return 0 def nodes(self): for i in range(2*self.len-1): self.eval(i) res = self.node[self.len-1:] return list(res) N = int(input()) a = [int(i) for i in input().split()] dr = {} #数numのうち最も右にあるものはdr[num] dl = {} for i, num in enumerate(a): dr[num] = i ar = a[::-1] for i, num in enumerate(ar): dl[num] = N-1-i seg = segtree(N) for num, _ in sorted(dr.items()): l = dl[num] r = dr[num] seg.range_update(l, r+1, num) ans = seg.nodes() ans = [str(i) for i in ans if i] print(" ".join(ans))