提出 #62575641
ソースコード 拡げる
#![allow(unused)]
fn main() {
let n = read::<usize>();
let p = mapv(&readv::<usize>(), |&x| x - 1);
let mut treap = Treap::<usize>::new();
for i in 0..n {
treap.insert_at_pos(i + 1, p[i]);
}
let arr = treap.to_vec();
println!("{}", join(&arr, " "));
}
#[derive(Debug)]
struct Treap<T> {
root: Option<usize>,
lch: Vec<Option<usize>>,
rch: Vec<Option<usize>>,
siz: Vec<usize>,
key: Vec<T>,
rnd: Vec<u32>,
seed: u32,
}
impl<T> Treap<T>
where
T: std::cmp::PartialOrd + Clone + std::fmt::Display,
{
fn new() -> Self {
Self {
root: None,
lch: vec![],
rch: vec![],
siz: vec![],
key: vec![],
rnd: vec![],
seed: 1234,
}
}
fn new_node(&mut self, k: T) -> usize {
let mut rnd = self.seed;
rnd ^= rnd << 13;
rnd ^= rnd >> 17;
rnd ^= rnd << 5;
self.seed = rnd;
let id = self.key.len();
self.lch.push(None);
self.rch.push(None);
self.siz.push(1);
self.key.push(k);
self.rnd.push(rnd);
id
}
fn size(&self, u: Option<usize>) -> usize {
if let Some(u) = u {
self.siz[u]
} else {
0
}
}
fn pull(&mut self, u: usize) {
self.siz[u] = 1 + self.size(self.lch[u]) + self.size(self.rch[u]);
}
fn split_by_size(&mut self, u: Option<usize>, size: usize) -> (Option<usize>, Option<usize>) {
if let Some(u) = u {
if size <= self.size(self.lch[u]) {
// pivot is at lch
// u
// / \
// a+b rch
// ---------
// a u
// / \
// b rch
let (a, b) = self.split_by_size(self.lch[u], size);
self.lch[u] = b;
self.pull(u);
(a, Some(u))
} else {
// pivot is at rch
// u
// / \
// lch a+b
// ---------
// u b
// / \
// lch a
let (a, b) = self.split_by_size(self.rch[u], size - self.size(self.lch[u]) - 1);
self.rch[u] = a;
self.pull(u);
(Some(u), b)
}
} else {
(None, None)
}
}
fn split_by_key(&mut self, u: Option<usize>, key: T) -> (Option<usize>, Option<usize>) {
if let Some(u) = u {
if key <= self.key[u] {
let (a, b) = self.split_by_key(self.lch[u], key);
self.lch[u] = b;
self.pull(u);
(a, Some(u))
} else {
let (a, b) = self.split_by_key(self.rch[u], key);
self.rch[u] = a;
self.pull(u);
(Some(u), b)
}
} else {
(None, None)
}
}
fn merge(&mut self, a: Option<usize>, b: Option<usize>) -> Option<usize> {
if let Some((a, b)) = a.zip(b) {
if self.rnd[a] > self.rnd[b] {
// merge b into rch of a
// a b
// / \
// lch rch
// -------------
// a
// / \
// lch rch+b
self.rch[a] = self.merge(self.rch[a], Some(b));
self.pull(a);
Some(a)
} else {
// merge a into lch of b
// a b
// / \
// lch rch
// -------------
// b
// / \
// a+lch rch
self.lch[b] = self.merge(Some(a), self.lch[b]);
self.pull(b);
Some(b)
}
} else {
a.or(b)
}
}
fn insert_at_pos(&mut self, k: T, p: usize) {
let node = self.new_node(k);
let (t1, t2) = self.split_by_size(self.root, p);
self.root = self.merge(t1, Some(node));
self.root = self.merge(self.root, t2);
}
fn insert_key(&mut self, k: T) {
let node = self.new_node(k.clone());
let (t1, t2) = self.split_by_key(self.root, k);
self.root = self.merge(t1, Some(node));
self.root = self.merge(self.root, t2);
}
fn traverse<F: FnMut(Option<T>, usize)>(
&self,
u: Option<usize>,
dep: usize,
f: &mut F,
mode: &str,
) {
if let Some(u) = u {
match mode {
"pre" => {
f(Some(self.key[u].clone()), dep);
self.traverse(self.lch[u], dep + 1, f, mode);
self.traverse(self.rch[u], dep + 1, f, mode);
}
"in" => {
self.traverse(self.lch[u], dep + 1, f, mode);
f(Some(self.key[u].clone()), dep);
self.traverse(self.rch[u], dep + 1, f, mode);
}
"post" => {
self.traverse(self.lch[u], dep + 1, f, mode);
self.traverse(self.rch[u], dep + 1, f, mode);
f(Some(self.key[u].clone()), dep);
}
_ => (),
}
} else {
f(None, dep);
}
}
fn to_vec(&self) -> Vec<T> {
let mut arr = vec![];
self.traverse(
self.root,
0,
&mut |key, dep| {
if let Some(key) = key {
arr.push(key)
}
},
"in",
);
arr
}
fn show(&self) {
self.traverse(
self.root,
0,
&mut |key, dep| {
if let Some(key) = key {
println!("{}- {}", " ".repeat(dep * 2), key);
} else {
println!("{}- None", " ".repeat(dep * 2));
}
},
"pre",
);
}
}
fn read<T: std::str::FromStr>() -> T {
let mut s = String::new();
std::io::stdin().read_line(&mut s).ok();
s.trim().parse().ok().unwrap()
}
fn readv<T: std::str::FromStr>() -> Vec<T> {
read::<String>()
.split_ascii_whitespace()
.map(|t| t.parse().ok().unwrap())
.collect()
}
fn reads() -> Vec<char> {
read::<String>().chars().collect()
}
fn mapv<T, S, F: Fn(&T) -> S>(arr: &Vec<T>, f: F) -> Vec<S> {
arr.iter().map(f).collect()
}
fn join<T: ToString>(arr: &[T], sep: &str) -> String {
arr.iter()
.map(|x| x.to_string())
.collect::<Vec<String>>()
.join(sep)
}
提出情報
| 提出日時 |
|
| 問題 |
F - Insert |
| ユーザ |
amoshuangyc |
| 言語 |
Rust (rustc 1.70.0) |
| 得点 |
500 |
| コード長 |
7131 Byte |
| 結果 |
AC |
| 実行時間 |
856 ms |
| メモリ |
65964 KiB |
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
500 / 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 |
1 ms |
1904 KiB |
| random_01.txt |
AC |
849 ms |
65904 KiB |
| random_02.txt |
AC |
238 ms |
26456 KiB |
| random_03.txt |
AC |
856 ms |
65836 KiB |
| random_04.txt |
AC |
102 ms |
14520 KiB |
| random_05.txt |
AC |
854 ms |
65800 KiB |
| random_06.txt |
AC |
316 ms |
32408 KiB |
| random_07.txt |
AC |
843 ms |
65740 KiB |
| random_08.txt |
AC |
34 ms |
6944 KiB |
| random_09.txt |
AC |
193 ms |
65964 KiB |
| random_10.txt |
AC |
211 ms |
65896 KiB |
| random_11.txt |
AC |
198 ms |
65904 KiB |
| random_12.txt |
AC |
251 ms |
65948 KiB |
| random_13.txt |
AC |
381 ms |
65940 KiB |
| random_14.txt |
AC |
400 ms |
65908 KiB |
| random_15.txt |
AC |
536 ms |
65844 KiB |
| random_16.txt |
AC |
575 ms |
65760 KiB |
| sample_01.txt |
AC |
1 ms |
1988 KiB |
| sample_02.txt |
AC |
0 ms |
1796 KiB |