标签:
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]));
}
标签:
原文地址:http://www.cnblogs.com/Milkor/p/4306552.html