提出 #62587787


ソースコード 拡げる

from random import randint
from typing import Tuple


class Node:
    def __init__(self, key):
        self.key = key
        self.rnd = randint(0, 1 << 30)
        self.lch = None
        self.rch = None
        self.size = 1


class Treap:
    def __init__(self):
        self.root = None

    def size(self, node):
        return node.size if node else 0

    def pull(self, node):
        node.size = 1 + self.size(node.lch) + self.size(node.rch)

    def split_by_size(
        self, u: Node | None, size: int
    ) -> Tuple[Node | None, Node | None]:
        if u is None:
            return None, None
        if size <= self.size(u.lch):
            a, b = self.split_by_size(u.lch, size)
            u.lch = b
            self.pull(u)
            return a, u
        else:
            a, b = self.split_by_size(u.rch, size - self.size(u.lch) - 1)
            u.rch = a
            self.pull(u)
            return u, b

    def merge(self, a: Node | None, b: Node | None) -> Node | None:
        if a is None:
            return b
        if b is None:
            return a
        if a.rnd > b.rnd:
            a.rch = self.merge(a.rch, b)
            self.pull(a)
            return a
        else:
            b.lch = self.merge(a, b.lch)
            self.pull(b)
            return b

    def insert_at_pos(self, k, p: int):
        t1, t2 = self.split_by_size(self.root, p)
        self.root = self.merge(t1, Node(k))
        self.root = self.merge(self.root, t2)

    def traverse(self, u: Node | None, f, dep: int = 0, mode="in"):
        if u is None:
            f(u, dep)
        else:
            if mode == "pre":
                f(u, dep)
                self.traverse(u.lch, f, dep + 1, mode)
                self.traverse(u.rch, f, dep + 1, mode)
            elif mode == "in":
                self.traverse(u.lch, f, dep + 1, mode)
                f(u, dep)
                self.traverse(u.rch, f, dep + 1, mode)
            else:  # post
                self.traverse(u.lch, f, dep + 1, mode)
                self.traverse(u.rch, f, dep + 1, mode)
                f(u, dep)

    def to_list(self):
        arr = []

        def f(node, dep):
            if node:
                arr.append(node.key)

        self.traverse(self.root, f, mode="in")
        return arr

    def show(self):
        def f(node, dep):
            if node is None:
                print(f"{' ' * (dep * 2)}- None")
            else:
                print(f"{' ' * (dep * 2)}- {node.key}")

        self.traverse(self.root, f, mode="pre")


N = int(input())
P = [int(x) - 1 for x in input().split()]

treap = Treap()
for i, p in enumerate(P):
    treap.insert_at_pos(i + 1, p)
ans = treap.to_list()
print(" ".join(map(str, ans)))

提出情報

提出日時
問題 F - Insert
ユーザ amoshuangyc
言語 Python (PyPy 3.10-v7.3.12)
得点 0
コード長 2835 Byte
結果 TLE
実行時間 2215 ms
メモリ 214632 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 0 / 500
結果
AC × 2
AC × 11
TLE × 8
セット名 テストケース
Sample sample_01.txt, sample_02.txt
All min.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, sample_01.txt, sample_02.txt
ケース名 結果 実行時間 メモリ
min.txt AC 135 ms 88960 KiB
random_01.txt TLE 2214 ms 140320 KiB
random_02.txt AC 1761 ms 136808 KiB
random_03.txt TLE 2214 ms 140248 KiB
random_04.txt AC 883 ms 118476 KiB
random_05.txt TLE 2214 ms 140284 KiB
random_06.txt AC 1926 ms 143076 KiB
random_07.txt TLE 2214 ms 140764 KiB
random_08.txt AC 585 ms 108084 KiB
random_09.txt AC 1179 ms 212004 KiB
random_10.txt AC 1263 ms 214632 KiB
random_11.txt AC 1194 ms 199500 KiB
random_12.txt AC 1338 ms 193276 KiB
random_13.txt TLE 2054 ms 201180 KiB
random_14.txt TLE 2215 ms 160632 KiB
random_15.txt TLE 2215 ms 144552 KiB
random_16.txt TLE 2214 ms 140124 KiB
sample_01.txt AC 135 ms 88968 KiB
sample_02.txt AC 136 ms 88872 KiB