class MyCalendar {
class Seg {
int l;
int r;
boolean val;
Seg left;
Seg right; public Seg(int x, int y) {
this.l = x;
this.r = y;
this.val = false;
this.left = null;
this.right = null;
} public boolean exist(int left, int right) {
if(this.val){
return true;
}
int mid = (this.l + this.r) / 2; if (left > mid) {
if (this.right != null) {
return this.right.exist(left, right);
}
return false;
} else if (right <= mid) {
if (this.left != null) {
return this.left.exist(left, right);
}
return false;
} else {
boolean exist = false;
if (this.left != null) {
exist = this.left.exist(left, mid);
}
if (this.right != null) {
exist = exist | this.right.exist(mid + 1, right);
}
return exist;
}
} public void insert(int start, int end) {
if (start <= this.l && this.r <= end) {
this.val = true;
return;
}
int mid = (this.l + this.r) / 2;
if (start > mid) {
if (this.right == null) {
this.right = new Seg(mid + 1, this.r);
}
this.right.insert(start, end);
} else if (end <= mid) {
if (this.left == null) {
this.left = new Seg(this.l, mid);
}
this.left.insert(start, end);
} else {
if (this.right == null) {
this.right = new Seg(mid + 1, this.r);
}
if (this.left == null) {
this.left = new Seg(this.l, mid);
}
this.right.insert(mid + 1, end);
this.left.insert(start, mid);
}
}
} Seg root = null; public MyCalendar() {
root = new Seg(0, 1000_000_000);
} public boolean book(int start, int end) {
if (root.exist(start, end-1)) {
return false;
}
root.insert(start, end-1);
return true;
} public static void main(String[] args) {
MyCalendar calendar = new MyCalendar();
System.out.println(calendar.book(47,50));
System.out.println(calendar.book(15,25));
System.out.println(calendar.book(20,30));
}
} /**
* Your MyCalendar object will be instantiated and called as such:
* MyCalendar obj = new MyCalendar();
* boolean param_1 = obj.book(start,end);
*/

【线段树】【leetcode 729. 我的日程安排表 I】的更多相关文章

  1. Java实现 LeetCode 729 我的日程安排表 I(二叉树)

    729. 我的日程安排表 I 实现一个 MyCalendar 类来存放你的日程安排.如果要添加的时间内没有其他安排,则可以存储这个新的日程安排. MyCalendar 有一个 book(int sta ...

  2. 【LeetCode】线段树 segment-tree(共9题)+ 树状数组 binary-indexed-tree(共5题)

    第一部分---线段树:https://leetcode.com/tag/segment-tree/ [218]The Skyline Problem [307]Range Sum Query - Mu ...

  3. C#LeetCode刷题-线段树

    线段树篇 # 题名 刷题 通过率 难度 218 天际线问题   32.7% 困难 307 区域和检索 - 数组可修改   42.3% 中等 315 计算右侧小于当前元素的个数   31.9% 困难 4 ...

  4. leetcode 699. Falling Squares 线段树的实现

    线段树实现.很多细节值得品味 都在注释里面了 class SegTree: def __init__(self,N,query_fn,update_fn): self.tree=[0]*(2*N+2) ...

  5. 线段树(Segment Tree)(转)

    原文链接:线段树(Segment Tree) 1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lg ...

  6. segment树(线段树)

    线段树(segment tree)是一种Binary Search Tree或者叫做ordered binary tree.对于线段树中的每一个非叶子节点[a,b],它的左子树表示的区间为[a,(a+ ...

  7. 最大子序和:暴力->递归->动规->线段树

    题目描述 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. LeetCode:53. 最大子序和 题解 显而易见的暴力解法 最容易想到的便是暴力穷 ...

  8. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  9. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  10. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

随机推荐

  1. .NET Core开发实战(第33课:集成事件:使用RabbitMQ来实现EventBus)--学习笔记(上)

    33 | 集成事件:使用RabbitMQ来实现EventBus 这一节我们来讲解如何通过 CAP 组件和 RabbitMQ 来实现 EventBus 要实现 EventBus,我们这里借助了 Rabb ...

  2. ABC 304

    T4 在一个平面上有一块面积无限的蛋糕,给出 \(n\) 颗草莓的所在位置和 \(a\,(b)\) 条平行与 \(x\,(y)\) 轴的切刀位置. 切刀会把蛋糕沿 \(x\,(y)\) 轴切开.因此一 ...

  3. 长沙IT技术圈百万年薪大佬?是否存在?

    引子 不知不觉,IT技术圈开始流传起"百万年薪"的故事,有人问我,长沙有百万大佬么?其实我也不知道. 一 背景 长沙自古以来就是文风鼎盛之地,在今天也同样如此. 目前长沙有211. ...

  4. Freaktab将于12月底关闭

    出过众多优秀固件的电视盒子论坛Freaktab, 将于2021年12月31日关闭 R.I.P

  5. Spring Boot图书管理系统项目实战-4.基础信息管理

    导航: pre:  3.用户登录 next:5.读者管理 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.页面设计 出版社管理.语种管理.书架管 ...

  6. Oracle设置和删除不可用列

    Oracle设置和删除不可用列 1.不可用列是什么? 就是表中的1个或多个列被ALTER TABLE-SET UNUSED 语句设置为无法再被程序利用的列. 2.使用场景? If you are co ...

  7. yum源配置脚本

    # yum源配置脚本 #!/bin/bash mkdir /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bac ...

  8. SUB-LVDS 与LVDS 互联

    SUB-LVDS 与 LVDS介绍 电气规范 今天有同学问SUB-LVDS输出是否能接到LVDS输入上,以前没用过SUB-LVDS,一起学习一下. Sub-LVDS is a differential ...

  9. 大众点评cat报警源码

    类时序 时许说明 判断是否是报警机器. 1分钟启动一个线程根据设置的报警条件,时间段去查询CAT报告数据. 根据返回的报告数据,逐层解析TYPE,NAME,RANGE中的数据是否满足报警条件. 只有全 ...

  10. 【Filament】立方体贴图(6张图)

    1 前言 ​ 本文通过一个立方体贴图的例子,讲解三维纹理贴图(子网格贴图)的应用,案例中使用 6 张不同的图片给立方体贴图,图片如下. ​ 读者如果对 Filament 不太熟悉,请回顾以下内容. F ...