提出 #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 |
| 結果 |
|
|
| セット名 |
テストケース |
| 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 |