結果
問題 | No.1234 典型RMQ |
ユーザー | tktk_snsn |
提出日時 | 2020-12-13 01:11:02 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 558 ms / 2,000 ms |
コード長 | 3,881 bytes |
コンパイル時間 | 314 ms |
コンパイル使用メモリ | 82,176 KB |
実行使用メモリ | 98,944 KB |
最終ジャッジ日時 | 2024-11-09 02:38:55 |
合計ジャッジ時間 | 13,091 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 43 ms
52,608 KB |
testcase_01 | AC | 44 ms
52,736 KB |
testcase_02 | AC | 44 ms
53,120 KB |
testcase_03 | AC | 44 ms
53,376 KB |
testcase_04 | AC | 43 ms
52,736 KB |
testcase_05 | AC | 43 ms
52,608 KB |
testcase_06 | AC | 512 ms
98,048 KB |
testcase_07 | AC | 478 ms
95,232 KB |
testcase_08 | AC | 534 ms
98,432 KB |
testcase_09 | AC | 515 ms
97,152 KB |
testcase_10 | AC | 518 ms
98,600 KB |
testcase_11 | AC | 518 ms
97,792 KB |
testcase_12 | AC | 509 ms
97,220 KB |
testcase_13 | AC | 485 ms
95,744 KB |
testcase_14 | AC | 512 ms
96,128 KB |
testcase_15 | AC | 500 ms
96,088 KB |
testcase_16 | AC | 538 ms
98,816 KB |
testcase_17 | AC | 512 ms
96,768 KB |
testcase_18 | AC | 438 ms
95,448 KB |
testcase_19 | AC | 558 ms
98,304 KB |
testcase_20 | AC | 346 ms
98,944 KB |
testcase_21 | AC | 520 ms
97,792 KB |
testcase_22 | AC | 441 ms
98,688 KB |
testcase_23 | AC | 438 ms
98,584 KB |
testcase_24 | AC | 435 ms
98,944 KB |
testcase_25 | AC | 444 ms
98,696 KB |
testcase_26 | AC | 439 ms
98,688 KB |
testcase_27 | AC | 41 ms
52,992 KB |
testcase_28 | AC | 40 ms
52,608 KB |
testcase_29 | AC | 40 ms
52,864 KB |
ソースコード
import sys input = sys.stdin.buffer.readline sys.setrecursionlimit(10 ** 7) inf = 10**18 def op_data(L, R): return min(L, R) def op_lazy(L, R): return L + R def op_merge(L, R): return L + R u_data = inf u_lazy = 0 class LazySegmetTree: def __init__(self, size, op_data, u_data, op_lazy, u_lazy, op_merge): """ size: 元の配列の長さ op_data(Ldata, Rdata), u_data: クエリ関数、単位元 op_lazy(Llazy, Rlazy), u_lazy: 遅延作用の関数、単位元 op_merge(lazy, data): dataとlazyとの演算 """ self.N = size self.op_data = op_data self.op_lazy = op_lazy self.op_merge = op_merge self.u_data = u_data self.u_lazy = u_lazy self.data = [u_data] * (2 * self.N) self.lazy = [u_lazy] * (2 * self.N) def initialize(self, arr): op = self.op_data for i, a in enumerate(arr, self.N): self.data[i] = a for i in reversed(range(1, self.N)): self.data[i] = op(self.data[i << 1], self.data[i << 1 | 1]) def show(self): print("show array") for i in range(self.N): print(self.fold(i, i+1), end=" ") print("\n") def _propagate_top_down(self, L): op = self.op_lazy merge = self.op_merge unit = self.u_lazy for i in reversed(range(1, L.bit_length())): i = L >> i v = self.lazy[i] if v == unit: continue self.data[i] = merge(v, self.data[i]) self.lazy[i << 1] = op(v, self.lazy[i << 1]) self.lazy[i << 1 | 1] = op(v, self.lazy[i << 1 | 1]) self.lazy[i] = unit def _propagate_bottom_up(self, i): merge = self.op_merge op = self.op_data while i > 1: i >>= 1 self.data[i] = op(merge(self.lazy[i << 1], self.data[i << 1]), merge(self.lazy[i << 1 | 1], self.data[i << 1 | 1])) def fold(self, L, R): resL = self.u_data resR = self.u_data op = self.op_data merge = self.op_merge L += self.N R += self.N L0 = L // (L & -L) R0 = R // (R & -R) - 1 self._propagate_top_down(L0) self._propagate_top_down(R0) while L < R: if L & 1: resL = op(resL, merge(self.lazy[L], self.data[L])) L += 1 if R & 1: R -= 1 resR = op(merge(self.lazy[R], self.data[R]), resR) L >>= 1 R >>= 1 return op(resL, resR) def update(self, i, val): # 未調整 i += self.N i0 = i // (i & -i) self._propagate_top_down(i0) self.data[i] = self.op_merge(self.lazy[i], self.data[i]) self.data[i] = self.op_data(val, self.data[i]) self.lazy[i] = self.u_lazy self._propagate_bottom_up(i0) def range_update(self, L, R, val): op = self.op_lazy L += self.N R += self.N L0 = L // (L & -L) R0 = R // (R & -R) - 1 self._propagate_top_down(L0) self._propagate_top_down(R0) while L < R: if L & 1: self.lazy[L] = op(val, self.lazy[L]) L += 1 if R & 1: R -= 1 self.lazy[R] = op(val, self.lazy[R]) L >>= 1 R >>= 1 self._propagate_bottom_up(L0) self._propagate_bottom_up(R0) n = int(input()) A = list(map(int, input().split())) q = int(input()) query = tuple(tuple(map(int, input().split())) for _ in range(q)) seg = LazySegmetTree(n, op_data, u_data, op_lazy, u_lazy, op_merge) seg.initialize(A) for k, l, r, c in query: if k == 1: seg.range_update(l - 1, r, c) else: print(seg.fold(l-1, r))