《六月集训》(第二十四天)——线段树

前言

        欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
        今天是六月集训第二十四天:线段树🔥🔥🔥🔥🔥
在这里插入图片描述

一、练习题目

        731. 我的日程安排表 II
        699. 掉落的方块

二、算法思路

  • 1、731. 我的日程安排表 II:利用差分的思想来做的题,再复习一遍差分思想吧,还没用线段树。🔥🔥🔥🔥🔥
      1.差分数组的定义
      假设有数组A,我们将数组A中的每一项与前一项的差值组成的新数组F称为差分数组。对于F显然有:
    F [ i ] = { A [ i ] ( i = 0 ) A [ i ] − A [ i − 1 ] ( i > 0 ) F[i]=\begin{cases} A[i](i=0)\\ A[i]-A[i -1](i >0)\end{cases} F[i]={A[i](i=0)A[i]A[i1](i>0)
    举例:
01234567
A[i]100101102103104105106107
F[i]1001111111

   2.差分数组特性

   计算数列各项的值:数列第i项的值是可以用差分数组的前i项和计算得到,即前缀和。 A [ i ] = F [ i ] + A [ i − 1 ] A[i] = F[i] + A[i-1] A[i]=F[i]+A[i1]
  快速执行区间的加减操作:比如数组A的1~5项都增加1:

01234567
A[i]101102103104105106106107
F[i]1002111111

可以发现规律了,差分数组F只改变了两边端点的值,在左闭右开的区间内,即上面的例子是:[1,6),起始端点加1,结尾端减1。
   3.差分数组应用
   结合此题来进行说明:我们要为每一个日期进行安排,每个日期安排的数组数量表示为数组AF表示差分数组。

12345678
A[i]00000000
F[i]00000000

执行A(1,5)后,根据题意start=1,end=5:

12345678
A[i]11110000
F[i]1000-1000

可以发现规律了,差分数组F只改变了两边端点的值,在左闭右开的区间内,即上面的例子是:[1,5),起始端点加1,结尾端减1。

  • 2、699. 掉落的方块:困难题🔥🔥🔥🔥🔥

三、源码剖析

// 731. 我的日程安排表 II
class MyCalendarTwo {
    map<int, int> cnt;
public:
    MyCalendarTwo() {
        cnt.clear();
    }
    
    bool book(int start, int end) {
        ++cnt[start];
        --cnt[end];
        int sum = 0;
        for(auto i : cnt) {
            sum += i.second;
            if(sum > 2) {
                --cnt[start];
                ++cnt[end];
                return false;
            }
        }
        return true;
    }
};
  • 1、见思路详解。
// 699. 掉落的方块

  • 1、
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值