区间合并问题

Hotel.
区间合并问题。
问题描述:N.N个房间。
10 6
1 3
1 3
1 3
1 3
2 5 5
1 6

10个房间
区间合并:
这类题目会询问区间中满足条件的连续最长区间,所以PushUp的时候需要对左右儿子的区间进行合并

这句话。真是十分有道理啊。
tree[] 本身记录的是什么呢? 是该点的最长连续区间的数值。这个定义。不难得出。
从。当达到这个值 就返回。 这个结果来看的话。可以很快地目测。即是存储最长的区间值。
PS:我一开始竟然在考虑。实际值1的格子存储的是从这个点开始到后面的区间值。我是忽略了。1-10 这样范围的数值上的定义啊。

如何实行合并呢?
弄出三棵树。
其实是每个节点记录三个值,从该节点左端往右有多少个连续的空位,从该节点右端往左有多少个连续的空位,该区间内最长连续空位长度为多少

void PushUp(int rt,int m)
{
lsum[rt] = lsum[rt<<1]; 该节点 从左往右数区间的最长连续数值 = 左节点的从左往右最长的连续数值。
rsum[rt] = rsum[rt<<1|1];
if (lsum[rt] == m - (m >> 1)) lsum[rt] += lsum[rt<<1|1];
if (rsum[rt] == (m >> 1)) rsum[rt] += rsum[rt<<1];
//上面是更新该节点的左右区间的信息。
//下面是更新该节点的最长连续区间的信息。
msum[rt] = max(lsum[rt<<1|1] + rsum[rt<<1] , max(msum[rt<<1] , msum[rt<<1|1]));
}

转载于:https://www.cnblogs.com/Milkor/p/4306552.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值