cp_library_rs/data_structure/
bbt_treap.rs

1//! implicit treap
2//!
3//! 列を管理するデータ構造
4
5use std::{
6    cmp::Ordering,
7    fmt::Debug,
8    ops::{Bound::*, RangeBounds},
9};
10
11use rand::{RngCore, SeedableRng};
12use rand_xorshift::XorShiftRng;
13
14use crate::{
15    algebraic_structure::actedmonoid::ActedMonoid,
16    tree::arena::{Arena, ArenaNode, Ptr},
17    tree::show_binary_tree::ShowBinaryTree,
18};
19
20type A<K, M> = Arena<TreapNode<K, M>>;
21
22// ========== node ==========
23
24/// Treap のノード
25pub struct TreapNode<K: Ord, M: ActedMonoid> {
26    /// キー
27    key: K,
28    /// 値
29    val: M::Val,
30    /// 集約値
31    sum: M::Val,
32    /// 作用
33    act: M::Act,
34    /// ヒープの重み値
35    prio: u32,
36    /// 部分木のサイズ
37    size: usize,
38    // ポインタ
39    left: Option<Ptr>,
40    right: Option<Ptr>,
41}
42
43impl<K: Ord, M: ActedMonoid> TreapNode<K, M> {
44    /// val と prio からノードを生成
45    pub fn new(key: K, val: M::Val, prio: u32) -> Self {
46        Self {
47            key,
48            sum: val.clone(),
49            val,
50            act: M::id(),
51            prio,
52            size: 1,
53            left: None,
54            right: None,
55        }
56    }
57}
58
59impl<K: Ord, M: ActedMonoid> ArenaNode for TreapNode<K, M> {}
60
61// ========== binary search ==========
62
63/// 境界の種類
64#[derive(Clone, Copy)]
65enum BoundKind {
66    /// lowerbound: (key < x, key >= x)
67    Lower,
68    /// upperbound: (key <= x, key > x)
69    Upper,
70}
71
72// ========== balanced binary tree ==========
73
74/// 平衡二分木
75pub struct BalancedBinaryTree<K: Ord, M: ActedMonoid> {
76    arena: Arena<TreapNode<K, M>>,
77    root: Option<Ptr>,
78    rng: XorShiftRng,
79}
80
81impl<K: Ord, M: ActedMonoid> Default for BalancedBinaryTree<K, M> {
82    fn default() -> Self {
83        Self {
84            arena: A::new(),
85            root: None,
86            rng: XorShiftRng::from_os_rng(),
87        }
88    }
89}
90
91impl<K: Ord + Clone, M: ActedMonoid> BalancedBinaryTree<K, M> {
92    /// key, val を挿入する(lowerbound 版)
93    /// - 既存の同一 key は右側(>=)に送るので,新要素は「同一 key の先頭」に入る
94    pub fn insert_lower(&mut self, key: K, val: M::Val) {
95        let prio = self.rng.next_u32();
96
97        // (key < k, key >= k)
98        let (l, r) = self.split_key_lower(self.root, &key);
99
100        let ptr = self.arena.alloc(TreapNode::new(key, val, prio));
101        let mid = self.merge(l, Some(ptr));
102        self.root = self.merge(mid, r);
103    }
104
105    /// key, val を挿入する(upperbound 版)
106    /// - 既存の同一 key は左側(<=)に送るので,新要素は「同一 key の末尾」に入る
107    pub fn insert_upper(&mut self, key: K, val: M::Val) {
108        let prio = self.rng.next_u32();
109
110        // (key <= k, key > k)
111        let (l, r) = self.split_key_upper(self.root, &key);
112
113        let ptr = self.arena.alloc(TreapNode::new(key, val, prio));
114        let mid = self.merge(l, Some(ptr));
115        self.root = self.merge(mid, r);
116    }
117
118    /// key がまだ存在しないときだけ (key, val) を挿入する
119    /// - 返り値: 挿入できたら true, 既に存在していたら false
120    pub fn insert_unique(&mut self, key: K, val: M::Val) -> bool {
121        let prio = self.rng.next_u32();
122
123        // A: key < k,  BC: key >= k
124        let (a, bc) = self.split_key_lower(self.root, &key);
125
126        // B: key == k, C: key > k
127        //
128        // bc の中は全て key >= k なので,
129        // upperbound 分割 (<=k, >k) をすると B が key==k の塊になる.
130        let (b, c) = self.split_key_upper(bc, &key);
131
132        if b.is_some() {
133            // 既に存在するので挿入しない:元に戻す
134            let bc2 = self.merge(b, c);
135            self.root = self.merge(a, bc2);
136            false
137        } else {
138            // 存在しないので挿入:A + new + C にして戻す
139            let ptr = self.arena.alloc(TreapNode::new(key, val, prio));
140            let ac = self.merge(a, Some(ptr));
141            self.root = self.merge(ac, c);
142            true
143        }
144    }
145
146    /// key をもつ要素を削除する(存在すれば全て削除)
147    /// - 返り値: 1 個以上削除できたら true
148    pub fn remove(&mut self, key: &K) -> bool {
149        // A: key < k, BC: key >= k
150        let (a, bc) = self.split_key_lower(self.root, key);
151
152        // B: key == k, C: key > k
153        let (b, c) = self.split_key_upper(bc, key);
154
155        let removed = b.is_some();
156
157        // B を捨てて A + C に戻す
158        self.root = self.merge(a, c);
159
160        removed
161    }
162
163    /// 区間(key の範囲)の集約値を返す
164    pub fn get_range<R: RangeBounds<K> + Debug>(&mut self, range: R) -> M::Val {
165        // まず左境界で split: A | BC
166        let (a, bc) = match range.start_bound() {
167            Unbounded => (None, self.root),
168            Included(l) => self.split_key_lower(self.root, l), // key < l | key >= l
169            Excluded(l) => self.split_key_upper(self.root, l), // key <= l | key > l なので左が <=l
170        };
171
172        // 次に右境界で split: B | C (B が範囲内)
173        let (b, c) = match range.end_bound() {
174            Unbounded => (bc, None),
175            Included(r) => {
176                // 欲しいのは key <= r を左に残す(= upperbound)
177                self.split_key_upper(bc, r) // key <= r | key > r
178            }
179            Excluded(r) => {
180                // 欲しいのは key < r を左に残す(= lowerbound)
181                self.split_key_lower(bc, r) // key < r | key >= r
182            }
183        };
184
185        let ans = b
186            .map(|ptr| self.arena.get(ptr).sum.clone())
187            .unwrap_or(M::e());
188
189        // 戻す
190        let bc2 = self.merge(b, c);
191        self.root = self.merge(a, bc2);
192
193        ans
194    }
195
196    /// 区間(key の範囲)に作用を適用する
197    pub fn apply<R: RangeBounds<K> + Debug>(&mut self, range: R, act: M::Act) {
198        let (a, bc) = match range.start_bound() {
199            Unbounded => (None, self.root),
200            Included(l) => self.split_key_lower(self.root, l), // key < l | key >= l
201            Excluded(l) => self.split_key_upper(self.root, l), // key <= l | key > l
202        };
203
204        let (b, c) = match range.end_bound() {
205            Unbounded => (bc, None),
206            Included(r) => self.split_key_upper(bc, r), // key <= r | key > r
207            Excluded(r) => self.split_key_lower(bc, r), // key < r | key >= r
208        };
209
210        if let Some(ptr) = b {
211            self.apply_lazy(ptr, &act);
212        }
213
214        let bc2 = self.merge(b, c);
215        self.root = self.merge(a, bc2);
216    }
217
218    /// 空であるか判定する
219    pub fn is_empty(&self) -> bool {
220        self.len() == 0
221    }
222
223    /// 要素数をカウントする
224    pub fn len(&self) -> usize {
225        self.root.map(|p| self.arena.get(p).size).unwrap_or(0)
226    }
227
228    // ========== internal ==========
229
230    /// 部分木のサイズ
231    #[inline]
232    fn size_of(&self, ptr: Option<Ptr>) -> usize {
233        ptr.map(|ptr| self.arena.get(ptr).size).unwrap_or(0)
234    }
235
236    /// 部分木の集約
237    #[inline]
238    fn sum_of(&self, ptr: Option<Ptr>) -> M::Val {
239        ptr.map(|ptr| self.arena.get(ptr).sum.clone())
240            .unwrap_or(M::e())
241    }
242
243    /// ノード `ptr` が表す部分木全体に作用を適用
244    #[inline]
245    fn apply_lazy(&mut self, ptr: Ptr, act: &M::Act) {
246        let (nval, nsum) = {
247            let v = self.arena.get(ptr);
248            (M::mapping(&v.val, act), M::mapping(&v.sum, act))
249        };
250        let composed = {
251            let v = self.arena.get(ptr);
252            M::compose(&v.act, act)
253        };
254
255        let v = self.arena.get_mut(ptr);
256        v.val = nval;
257        v.sum = nsum;
258        v.act = composed;
259    }
260
261    /// 子の情報を吸い上げる
262    #[inline]
263    fn pull(&mut self, ptr: Ptr) {
264        let (l, r, val) = {
265            let v = self.arena.get(ptr);
266            (v.left, v.right, v.val.clone())
267        };
268
269        let lsize = self.size_of(l);
270        let rsize = self.size_of(r);
271
272        let lsum = self.sum_of(l);
273        let rsum = self.sum_of(r);
274
275        // 集約: L + [val] + R
276        let sum = M::op(&M::op(&lsum, &val), &rsum);
277
278        let v = self.arena.get_mut(ptr);
279        v.size = lsize + rsize + 1;
280        v.sum = sum;
281    }
282
283    /// 子に伝播する
284    #[inline]
285    fn push(&mut self, ptr: Ptr) {
286        let (act, l, r) = {
287            let v = self.arena.get(ptr);
288            (v.act.clone(), v.left, v.right)
289        };
290
291        // 作用の伝播
292        if act != M::id() {
293            if let Some(lp) = l {
294                self.apply_lazy(lp, &act);
295            }
296            if let Some(rp) = r {
297                self.apply_lazy(rp, &act);
298            }
299            self.arena.get_mut(ptr).act = M::id();
300        }
301    }
302
303    /// 共通実装
304    /// - Lower:  L = {key < x},  R = {key >= x}
305    /// - Upper:  L = {key <= x}, R = {key > x}
306    fn split_key_impl(
307        &mut self,
308        ptr: Option<Ptr>,
309        x: &K,
310        kind: BoundKind,
311    ) -> (Option<Ptr>, Option<Ptr>)
312    where
313        K: Clone,
314    {
315        let Some(ptr) = ptr else {
316            return (None, None);
317        };
318
319        self.push(ptr);
320
321        // 借用衝突を避けるため,必要情報をコピーしてから再帰する
322        let (key, left, right) = {
323            let v = self.arena.get(ptr);
324            (v.key.clone(), v.left, v.right)
325        };
326
327        // 左側に残るべきか?(true なら ptr は L 側,false なら R 側)
328        let go_left = match (key.cmp(x), kind) {
329            (Ordering::Less, _) => true,
330            (Ordering::Equal, BoundKind::Lower) => false, // key == x は右へ
331            (Ordering::Equal, BoundKind::Upper) => true,  // key == x は左へ
332            (Ordering::Greater, _) => false,
333        };
334
335        if go_left {
336            // ptr は L 側に残す:右部分木を分割して,左片を ptr.right に戻す
337            let (l, r) = self.split_key_impl(right, x, kind);
338            self.arena.get_mut(ptr).right = l;
339            self.pull(ptr);
340            (Some(ptr), r)
341        } else {
342            // ptr は R 側に残す:左部分木を分割して,右片を ptr.left に戻す
343            let (l, r) = self.split_key_impl(left, x, kind);
344            self.arena.get_mut(ptr).left = r;
345            self.pull(ptr);
346            (l, Some(ptr))
347        }
348    }
349
350    /// lowerbound 版: (key < x, key >= x)
351    fn split_key_lower(&mut self, ptr: Option<Ptr>, x: &K) -> (Option<Ptr>, Option<Ptr>)
352    where
353        K: Clone,
354    {
355        self.split_key_impl(ptr, x, BoundKind::Lower)
356    }
357
358    /// upperbound 版: (key <= x, key > x)
359    fn split_key_upper(&mut self, ptr: Option<Ptr>, x: &K) -> (Option<Ptr>, Option<Ptr>)
360    where
361        K: Clone,
362    {
363        self.split_key_impl(ptr, x, BoundKind::Upper)
364    }
365
366    /// ptr を根とする木を,左から n 番目までのノードとそれ以外のノードに分解する
367    fn split_nth(&mut self, ptr: Option<Ptr>, n: usize) -> (Option<Ptr>, Option<Ptr>) {
368        let Some(ptr) = ptr else {
369            return (None, None);
370        };
371
372        self.push(ptr);
373
374        let node = self.arena.get(ptr);
375        let lsize = self.size_of(node.left);
376
377        if n <= lsize {
378            let (l, r) = self.split_nth(node.left, n);
379            self.arena.get_mut(ptr).left = r;
380            self.pull(ptr);
381
382            (l, Some(ptr))
383        } else {
384            let (l, r) = self.split_nth(node.right, n - lsize - 1);
385            self.arena.get_mut(ptr).right = l;
386            self.pull(ptr);
387
388            (Some(ptr), r)
389        }
390    }
391
392    /// left, right を根とする木を併合する
393    fn merge(&mut self, left: Option<Ptr>, right: Option<Ptr>) -> Option<Ptr> {
394        match (left, right) {
395            (None, ptr) | (ptr, None) => ptr,
396            (Some(left), Some(right)) => {
397                let pl = self.arena.get(left).prio;
398                let pr = self.arena.get(right).prio;
399
400                if pl < pr {
401                    // left を根にする
402                    self.push(left);
403                    let lr = self.arena.get(left).right;
404                    self.arena.get_mut(left).right = self.merge(lr, Some(right));
405                    self.pull(left);
406
407                    Some(left)
408                } else {
409                    // right を根にする
410                    self.push(right);
411                    let rl = self.arena.get(right).left;
412                    self.arena.get_mut(right).left = self.merge(Some(left), rl);
413                    self.pull(right);
414
415                    Some(right)
416                }
417            }
418        }
419    }
420}
421
422// ========== debug ==========
423
424impl<K, M> ShowBinaryTree<Ptr> for BalancedBinaryTree<K, M>
425where
426    K: Ord + Debug,
427    M: ActedMonoid,
428    M::Val: Debug,
429    M::Act: Debug,
430{
431    fn get_root(&self) -> Option<Ptr> {
432        self.root
433    }
434    fn get_left(&self, ptr: &Ptr) -> Option<Ptr> {
435        self.arena.get(*ptr).left
436    }
437    fn get_right(&self, ptr: &Ptr) -> Option<Ptr> {
438        self.arena.get(*ptr).right
439    }
440    fn print_node(&self, ptr: &Ptr) -> String {
441        format!(
442            "[key:{:?}, val:{:?}, sum:{:?}, act:{:?}]",
443            self.arena.get(*ptr).key,
444            self.arena.get(*ptr).val,
445            self.arena.get(*ptr).sum,
446            self.arena.get(*ptr).act,
447        )
448    }
449}