提出 #25320121
ソースコード 拡げる
from typing import List
import math
"""
遅延セグメント木
ref: <https://algo-logic.info/segment-tree/>
"""
class Segtree:
def __init__(self, n: int, arr: List[int], op, e: int):
# e: モノイド演算 op の単位元 max -> -INF, min -> INF
self.n = n
self.op = op
self.e = e
self.dat = [e] * (2 * n - 1)
for i in range(n - 1, 2 * n - 1):
self.dat[i] = arr[i - n + 1]
self.lazy = [e] * (2 * n - 1)
# print(self.dat)
def _print_tree(self, tree: List[int]):
l = 1
cnt = 0
for e in tree:
print(e, end=" ")
if cnt == l - 1:
print()
l *= 2
cnt += 1
def _refresh(self, k: int):
if self.lazy[k] == self.e:
return
# is not leaf
if k < self.n - 1:
# 子に更新を伝播
self.lazy[k * 2 + 1] = self.lazy[k]
self.lazy[k * 2 + 2] = self.lazy[k]
self.dat[k] = self.lazy[k]
self.lazy[k] = self.e
def _update_rec(self, a: int, b: int, x: int, k: int, l: int, r: int):
self._refresh(k)
if a <= l and r <= b:
self.lazy[k] = x
self._refresh(k)
elif a < r and l < b:
# left
self._update_rec(a, b, x, k * 2 + 1, l, (l + r) // 2)
# right
self._update_rec(a, b, x, k * 2 + 2, (l + r) // 2, r)
self.dat[k] = self.op(self.dat[k * 2 + 1], self.dat[k * 2 + 2])
def update(self, a: int, b: int, x: int):
"""
[a, b) を x に更新する
"""
self._update_rec(a, b, x, 0, 0, self.n)
# print(f'update')
# self._print_tree(self.dat)
def _query_rec(self, a: int, b: int, k: int, l: int, r: int):
self._refresh(k)
# [l, r) が範囲内だったら返す
# 遅延なし
if r <= a or b <= l:
return self.e
# 完全に範囲内
elif a <= l and r <= b:
return self.dat[k]
else:
vl = self._query_rec(a, b, k * 2 + 1, l, (l + r) // 2)
vr = self._query_rec(a, b, k * 2 + 2, (l + r) // 2, r)
return self.op(vl, vr)
def query(self, a: int, b: int):
"""
範囲 [a, b) に対して op をする
"""
res = self._query_rec(a, b, 0, 0, self.n)
# print(f'query')
# self._print_tree(self.dat)
return res
if __name__ == "__main__":
w, n = list(map(int, input().split()))
w = 2 ** math.ceil(math.log2(w))
segtree = Segtree(w, [0] * w, max, 0)
for i in range(n):
l, r = list(map(int, input().split()))
mx = segtree.query(l, r + 1)
segtree.update(l, r + 1, mx + 1)
print(mx + 1)
提出情報
ジャッジ結果
| セット名 |
Sample |
Subtask1 |
Subtask2 |
Subtask3 |
| 得点 / 配点 |
0 / 0 |
1 / 1 |
1 / 1 |
3 / 3 |
| 結果 |
|
|
|
|
| セット名 |
テストケース |
| Sample |
subtask01_01_sample_01.txt, subtask01_01_sample_02.txt, subtask01_01_sample_03.txt, subtask02_01_sample_04.txt |
| Subtask1 |
subtask01_01_sample_01.txt, subtask01_01_sample_02.txt, subtask01_01_sample_03.txt, subtask01_02_max_01.txt, subtask01_03_random_01.txt, subtask01_03_random_02.txt, subtask01_03_random_03.txt, subtask01_03_random_04.txt, subtask01_03_random_05.txt, subtask01_04_special_01.txt, subtask01_04_special_02.txt, subtask01_04_special_03.txt |
| Subtask2 |
subtask01_01_sample_01.txt, subtask01_01_sample_02.txt, subtask01_01_sample_03.txt, subtask01_02_max_01.txt, subtask01_03_random_01.txt, subtask01_03_random_02.txt, subtask01_03_random_03.txt, subtask01_03_random_04.txt, subtask01_03_random_05.txt, subtask01_04_special_01.txt, subtask01_04_special_02.txt, subtask01_04_special_03.txt, subtask02_01_sample_04.txt, subtask02_02_max_02.txt, subtask02_05_random_01.txt, subtask02_05_random_02.txt, subtask02_05_random_03.txt, subtask02_05_random_04.txt, subtask02_05_random_05.txt, subtask02_06_special_01.txt, subtask02_06_special_02.txt, subtask02_06_special_03.txt |
| Subtask3 |
subtask01_01_sample_01.txt, subtask01_01_sample_02.txt, subtask01_01_sample_03.txt, subtask01_02_max_01.txt, subtask01_03_random_01.txt, subtask01_03_random_02.txt, subtask01_03_random_03.txt, subtask01_03_random_04.txt, subtask01_03_random_05.txt, subtask01_04_special_01.txt, subtask01_04_special_02.txt, subtask01_04_special_03.txt, subtask02_01_sample_04.txt, subtask02_02_max_02.txt, subtask02_05_random_01.txt, subtask02_05_random_02.txt, subtask02_05_random_03.txt, subtask02_05_random_04.txt, subtask02_05_random_05.txt, subtask02_06_special_01.txt, subtask02_06_special_02.txt, subtask02_06_special_03.txt, subtask03_02_max_03.txt, subtask03_07_random_01.txt, subtask03_07_random_02.txt, subtask03_07_random_03.txt, subtask03_08_special_01.txt, subtask03_08_special_02.txt, subtask03_08_special_03.txt, subtask03_08_special_04.txt, subtask03_08_special_05.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| subtask01_01_sample_01.txt |
AC |
109 ms |
75048 KiB |
| subtask01_01_sample_02.txt |
AC |
85 ms |
75264 KiB |
| subtask01_01_sample_03.txt |
AC |
89 ms |
75232 KiB |
| subtask01_02_max_01.txt |
AC |
257 ms |
79788 KiB |
| subtask01_03_random_01.txt |
AC |
268 ms |
81064 KiB |
| subtask01_03_random_02.txt |
AC |
224 ms |
79924 KiB |
| subtask01_03_random_03.txt |
AC |
320 ms |
81252 KiB |
| subtask01_03_random_04.txt |
AC |
371 ms |
83560 KiB |
| subtask01_03_random_05.txt |
AC |
272 ms |
78900 KiB |
| subtask01_04_special_01.txt |
AC |
265 ms |
78880 KiB |
| subtask01_04_special_02.txt |
AC |
332 ms |
80884 KiB |
| subtask01_04_special_03.txt |
AC |
281 ms |
80644 KiB |
| subtask02_01_sample_04.txt |
AC |
98 ms |
95748 KiB |
| subtask02_02_max_02.txt |
AC |
306 ms |
98752 KiB |
| subtask02_05_random_01.txt |
AC |
300 ms |
88772 KiB |
| subtask02_05_random_02.txt |
AC |
318 ms |
96632 KiB |
| subtask02_05_random_03.txt |
AC |
381 ms |
97520 KiB |
| subtask02_05_random_04.txt |
AC |
353 ms |
98156 KiB |
| subtask02_05_random_05.txt |
AC |
277 ms |
88592 KiB |
| subtask02_06_special_01.txt |
AC |
298 ms |
97192 KiB |
| subtask02_06_special_02.txt |
AC |
297 ms |
96508 KiB |
| subtask02_06_special_03.txt |
AC |
283 ms |
96896 KiB |
| subtask03_02_max_03.txt |
AC |
2998 ms |
114500 KiB |
| subtask03_07_random_01.txt |
AC |
3940 ms |
120200 KiB |
| subtask03_07_random_02.txt |
AC |
3448 ms |
102196 KiB |
| subtask03_07_random_03.txt |
AC |
3421 ms |
114996 KiB |
| subtask03_08_special_01.txt |
AC |
2517 ms |
110064 KiB |
| subtask03_08_special_02.txt |
AC |
3075 ms |
116064 KiB |
| subtask03_08_special_03.txt |
AC |
1006 ms |
99972 KiB |
| subtask03_08_special_04.txt |
AC |
3294 ms |
114616 KiB |
| subtask03_08_special_05.txt |
AC |
3770 ms |
115388 KiB |