提出 #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)

提出情報

提出日時
問題 029 - Long Bricks(★5)
ユーザ wakameTech
言語 PyPy3 (7.3.0)
得点 5
コード長 2906 Byte
結果 AC
実行時間 3940 ms
メモリ 120200 KiB

ジャッジ結果

セット名 Sample Subtask1 Subtask2 Subtask3
得点 / 配点 0 / 0 1 / 1 1 / 1 3 / 3
結果
AC × 4
AC × 12
AC × 22
AC × 31
セット名 テストケース
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