結果
問題 | No.649 ここでちょっとQK! |
ユーザー | sakikuroe |
提出日時 | 2022-08-13 08:45:42 |
言語 | Rust (1.77.0 + proconio) |
結果 |
AC
|
実行時間 | 370 ms / 3,000 ms |
コード長 | 7,940 bytes |
コンパイル時間 | 19,956 ms |
コンパイル使用メモリ | 403,004 KB |
実行使用メモリ | 11,776 KB |
最終ジャッジ日時 | 2024-09-24 12:14:51 |
合計ジャッジ時間 | 21,343 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,812 KB |
testcase_01 | AC | 1 ms
6,812 KB |
testcase_02 | AC | 1 ms
6,816 KB |
testcase_03 | AC | 261 ms
6,812 KB |
testcase_04 | AC | 53 ms
11,776 KB |
testcase_05 | AC | 55 ms
11,264 KB |
testcase_06 | AC | 53 ms
11,264 KB |
testcase_07 | AC | 1 ms
6,940 KB |
testcase_08 | AC | 1 ms
6,940 KB |
testcase_09 | AC | 1 ms
6,940 KB |
testcase_10 | AC | 1 ms
6,944 KB |
testcase_11 | AC | 1 ms
6,944 KB |
testcase_12 | AC | 153 ms
6,940 KB |
testcase_13 | AC | 151 ms
6,944 KB |
testcase_14 | AC | 151 ms
6,944 KB |
testcase_15 | AC | 160 ms
6,944 KB |
testcase_16 | AC | 159 ms
6,944 KB |
testcase_17 | AC | 177 ms
6,944 KB |
testcase_18 | AC | 196 ms
6,940 KB |
testcase_19 | AC | 223 ms
7,296 KB |
testcase_20 | AC | 240 ms
7,936 KB |
testcase_21 | AC | 259 ms
8,192 KB |
testcase_22 | AC | 278 ms
8,704 KB |
testcase_23 | AC | 303 ms
9,088 KB |
testcase_24 | AC | 325 ms
9,472 KB |
testcase_25 | AC | 346 ms
9,856 KB |
testcase_26 | AC | 370 ms
10,240 KB |
testcase_27 | AC | 2 ms
6,940 KB |
testcase_28 | AC | 2 ms
6,940 KB |
testcase_29 | AC | 2 ms
6,944 KB |
testcase_30 | AC | 147 ms
6,944 KB |
testcase_31 | AC | 154 ms
6,940 KB |
testcase_32 | AC | 1 ms
6,944 KB |
testcase_33 | AC | 1 ms
6,940 KB |
testcase_34 | AC | 1 ms
6,940 KB |
testcase_35 | AC | 1 ms
6,940 KB |
コンパイルメッセージ
warning: variable does not need to be mutable --> src/main.rs:81:17 | 81 | let mut p = self.parent; | ----^ | | | help: remove this `mut` | = note: `#[warn(unused_mut)]` on by default warning: variable does not need to be mutable --> src/main.rs:82:17 | 82 | let mut pp = (*p).parent; | ----^^ | | | help: remove this `mut` warning: variable does not need to be mutable --> src/main.rs:83:17 | 83 | let mut c; | ----^ | | | help: remove this `mut` warning: variable does not need to be mutable --> src/main.rs:172:38 | 172 | fn merge(mut l_root: *mut SplayNode, mut r_root: *mut SplayNode) -> *mut SplayNode { | ----^^^^^^ | | | help: remove this `mut` warning: variable does not need to be mutable --> src/main.rs:197:13 | 197 | let mut l_root = (*root).left; | ----^^^^^^ | | | help: remove this `mut` warning: variable does not need to be mutable --> src/main.rs:198:13 | 198 | let mut r_root = root; | ----^^^^^^ | | | help: remove this `mut` warning: variable does not need to be mutable --> src/main.rs:209:13 | 209 | let mut l_root = (*root).left; | ----^^^^^^ | | | help: remove this `mut` warning: variable does not need to be mutable --> src/main.rs:210:13 | 210 | let mut r_root = (*root).right; | ----^^^^^^ | | | help: remove this `mut`
ソースコード
use std::{ cmp::Ordering, ptr::{self, null_mut}, }; macro_rules! read_line { ($($xs: tt)*) => { let mut buf = String::new(); std::io::stdin().read_line(&mut buf).unwrap(); let mut iter = buf.split_whitespace(); expand!(iter, $($xs)*); }; } macro_rules! expand { ($iter: expr,) => {}; ($iter: expr, mut $var: ident : $type: tt, $($xs: tt)*) => { let mut $var = value!($iter, $type); expand!($iter, $($xs)*); }; ($iter: expr, $var: ident : $type: tt, $($xs: tt)*) => { let $var = value!($iter, $type); expand!($iter, $($xs)*); }; } macro_rules! value { ($iter:expr, ($($type: tt),*)) => { ($(value!($iter, $type)),*); }; ($iter: expr, [$type: tt; $len: expr]) => { (0..$len).map(|_| value!($iter, $type)).collect::<Vec<_>>() }; ($iter: expr, Chars) => { value!($iter, String).chars().collect::<Vec<_>>>() }; ($iter: expr, $type: ty) => { if let Some(v) = $iter.next() { v.parse::<$type>().ok() } else { None } }; } #[derive(Clone, PartialEq, Eq)] struct SplayNode { key: isize, left: *mut Self, right: *mut Self, parent: *mut Self, size: usize, } impl SplayNode { fn new(key: isize) -> Self { SplayNode { key, left: null_mut(), right: null_mut(), parent: null_mut(), size: 1, } } fn update(&mut self) { unsafe { self.size = 1; if !self.left.is_null() { self.size += (*(self.left)).size; } if !self.right.is_null() { self.size += (*(self.right)).size; } } } fn rotate(&mut self) { unsafe { let mut p = self.parent; let mut pp = (*p).parent; let mut c; if (*p).left == self { c = self.right; self.right = p; (*p).left = c; } else { c = self.left; self.left = p; (*p).right = c; } if !pp.is_null() { if (*pp).left == p { (*pp).left = self; } if (*pp).right == p { (*pp).right = self; } } self.parent = pp; (*p).parent = self; if !c.is_null() { (*c).parent = p; } (*p).update(); self.update(); } } fn state(&self) -> isize { unsafe { if !self.parent.is_null() && ptr::eq((*self.parent).left, self) { 1 } else if !self.parent.is_null() && ptr::eq((*self.parent).right, self) { -1 } else { 0 } } } fn splay(&mut self) { unsafe { while !self.parent.is_null() { if (*self.parent).state() == 0 { // zig self.rotate(); } else if (*self).state() == (*self.parent).state() { // zig-zag (*self.parent).rotate(); (*self).rotate(); } else { // zig-zig (*self).rotate(); (*self).rotate(); } } } } } fn get(mut root: *mut SplayNode, mut idx: usize) -> *mut SplayNode { unsafe { loop { let lsize = if !(*root).left.is_null() { (*(*root).left).size } else { 0 }; match idx.cmp(&lsize) { Ordering::Less => { root = (*root).left; } Ordering::Equal => { (*root).splay(); return root; } Ordering::Greater => { root = (*root).right; idx = idx - lsize - 1; } } } } } fn merge(mut l_root: *mut SplayNode, mut r_root: *mut SplayNode) -> *mut SplayNode { unsafe { if l_root.is_null() { r_root } else if r_root.is_null() { l_root } else { l_root = get(l_root, (*l_root).size - 1); (*l_root).right = r_root; (*r_root).parent = l_root; (*l_root).update(); l_root } } } fn split(mut root: *mut SplayNode, idx: usize) -> (*mut SplayNode, *mut SplayNode) { unsafe { if idx == 0 { return (null_mut(), root); } if idx == (*root).size { return (root, null_mut()); } root = get(root, idx); let mut l_root = (*root).left; let mut r_root = root; (*r_root).left = null_mut(); (*l_root).parent = null_mut(); (*r_root).update(); (l_root, r_root) } } fn remove(mut root: *mut SplayNode, idx: usize) -> (*mut SplayNode, *mut SplayNode) { unsafe { root = get(root, idx); let mut l_root = (*root).left; let mut r_root = (*root).right; if !l_root.is_null() { (*l_root).parent = null_mut() }; if !r_root.is_null() { (*r_root).parent = null_mut() }; (*root).left = null_mut(); (*root).right = null_mut(); (*root).update(); (merge(l_root, r_root), root) } } fn lower_bound(root: *mut SplayNode, x: isize) -> usize { unsafe { if x <= (*root).key { if (*root).left.is_null() { return 0; } else { lower_bound((*root).left, x) } } else { (if (*root).left.is_null() { 0 } else { (*(*root).left).size }) + if (*root).right.is_null() { 0 } else { lower_bound((*root).right, x) } + 1 } } } fn insert(root: *mut SplayNode, node: *mut SplayNode) -> *mut SplayNode { let idx = unsafe { lower_bound(root, (*node).key) }; let (l_root, r_root) = split(root, idx); merge(merge(l_root, node), r_root) } pub struct SplayBST { root: *mut SplayNode, } impl SplayBST { fn new() -> Self { SplayBST { root: null_mut() } } fn insert(&mut self, x: isize) { let add = Box::into_raw(Box::new(SplayNode::new(x))); if (self.root as *mut SplayNode).is_null() { self.root = add; } else { self.root = insert((*self).root, add); } } fn get(&mut self, idx: usize) -> Option<isize> { unsafe { if (*self).root.is_null() { return None; } if (*(*self).root).size <= idx { return None; } } self.root = get(self.root, idx); unsafe { if self.root.is_null() { None } else { Some((*self.root).key) } } } fn remove(&mut self, x: isize) { let idx = lower_bound((*self).root, x); self.root = remove((*self).root, idx).0; } } fn main() { read_line! { q: usize, k: usize, } let (q, k) = (q.unwrap(), k.unwrap()); let mut bst = SplayBST::new(); for _ in 0..q { read_line! { t: usize, v: isize, } let t = t.unwrap(); if t == 1 { let v = v.unwrap(); bst.insert(v); } else { if let Some(v) = bst.get(k - 1) { println!("{}", v); bst.remove(v); } else { println!("-1"); } } } }