rustgym 0.2.0

rustgym solutions
Documentation
use std::collections::BTreeMap;

#[derive(Default)]
struct MyCalendarTwo {
    double_booked: Vec<Interval>,
}

impl MyCalendarTwo {
    fn new() -> Self {
        let double_booked = vec![];
        MyCalendarTwo { double_booked }
    }

    fn book(&mut self, start: i32, end: i32) -> bool {
        let mut triple_booked = MyCalendar::new();
        for &(a, b) in &self.double_booked {
            let a = a.max(start);
            let b = b.min(end);
            if a < b && !triple_booked.book(a, b) {
                return false;
            }
        }
        self.double_booked.push((start, end));
        true
    }
}
type Interval = (i32, i32);
type Center = i32;

#[derive(Default)]
struct MyCalendar {
    btm: BTreeMap<Center, Interval>,
}

impl MyCalendar {
    fn new() -> Self {
        let btm: BTreeMap<Center, Interval> = BTreeMap::new();
        MyCalendar { btm }
    }

    fn book(&mut self, start: i32, end: i32) -> bool {
        let center = start + end;
        if let Some((_, &(_, last_end))) = self.btm.range(..=center).next_back() {
            if start < last_end {
                return false;
            }
        }
        if let Some((_, &(first_start, _))) = self.btm.range(center..).next() {
            if first_start < end {
                return false;
            }
        }
        self.btm.insert(center, (start, end));
        true
    }
}

#[test]
fn test() {
    let mut obj = MyCalendarTwo::new();
    assert_eq!(obj.book(10, 20), true);
    assert_eq!(obj.book(50, 60), true);
    assert_eq!(obj.book(10, 40), true);
    assert_eq!(obj.book(5, 15), false);
    assert_eq!(obj.book(5, 10), true);
    assert_eq!(obj.book(25, 55), true);
}