线段树
53. 最大子数组和 - 力扣(LeetCode) https://leetcode.cn/problems/maximum-subarray/
https://leetcode.cn/problems/maximum-subarray/solution/zui-da-zi-xu-he-by-leetcode-solution/
我的日程安排表 I - 我的日程安排表 I - 力扣(LeetCode) https://leetcode.cn/problems/my-calendar-i/solution/wo-de-ri-cheng-an-pai-biao-i-by-leetcode-nlxr/
方法三:线段树
利用线段树,假设我们开辟了数组 \textit{arr}[0,\cdots, 10^9]arr[0,⋯,10
9
],初始时每个元素的值都为 00,对于每次行程预订的区间 [\textit{start}, \textit{end})[start,end) ,则我们将区间中的元素 \textit{arr}[\textit{start},\cdots,\textit{end}-1]arr[start,⋯,end−1] 中的每个元素都标记为 11,每次调用 \texttt{book}book 时,我们只需要检测 \textit{arr}[\textit{start},\cdots,\textit{end}-1]arr[start,⋯,end−1] 区间内是否有元素被标记为 11。实际我们不必实际开辟数组 \textit{arr}arr,可采用动态线段树,懒标记 \textit{lazy}lazy 标记区间 [l,r][l,r] 已经被预订,\textit{tree}tree 记录区间 [l,r][l,r] 的是否存在标记为 11 的元素。
每次进行 \texttt{book}book 操作时,首先判断区间 [\textit{start},\cdots,\textit{end}-1][start,⋯,end−1] 是否存在元素被标记,如果存在被标记为 11 的元素,则表明该区间不可预订;否则,则将可以预订。预订完成后,将 \textit{arr}[\textit{start},\cdots,\textit{end}-1]arr[start,⋯,end−1] 进行标记为 11,并同时更新线段树。