区间有关的问题,如记录一个区间的最值和总量,并在区间的插入,删除修改中维护这些最值和总量,用线段树是很方便的。线段树拥有良好的树形二分特性。
详细的概念参考百度百科http://baike.baidu.com/view/670683.htm
在实现中,用以下几个变量就足够了。n记录一共用到了多少个节点,B表示每个顶点的线段的起点,E[i]表示每个线段的终点,C是权值,表示某个线段上的权。初始值为0。用lson和rson分别表示左孩子和右孩子
实现一个线段树,代码如下
线段树问题
1,铁路,假设城市铁路联网顺次连接着c个城市,每两个城市之间都有火车,座位数量有上限。铁路上的城市数量<=60000,座位数量<=60000,请求数量<=60000。
请求为,订票请求:如果这两个城市间的座位数量大于等于请求的数量,则输出T,并更新这两个城市间的火车的座位数量,否则,输出F。
考虑一下:如果顺次三个城市a,b,c (a,b)=3,(b,c)=2,则(a,c)=2,如果有人预定了ac之间的座位,则ab,bc的座位数量都要相应的减少,否则,预定ab的时候就可能出现错误。
该问题用线段树很容易解决。
2, 树的构造
一棵含有n个节点的树,所有的节点的编号为1,2,3,。。。,n,每个节点v都有一个权值s(v),也是1,2,3,4,。。n。对于编号为v的节点,定义t(v)为v的后代中所有权值小于s(v)的结点个数。现在给出这棵树及t(1),t(2),t(3),。。求出这棵树每个节点的权值。(多个解,只要任一个解就可以)
分析:不妨设有七个节点,编号为1,2,3,4,5,6,7
结构如下
1
2 3
4 5 6 7
t: 1,2,1,0,0,0,0
用先序遍历的顺序为1,2,4,5,3,6,7
设一个权值数组ans[1~7]
将Node1放到2位置,前面留空位一个,Node2放到位置4,前面留了1,3两个空位,2已经被用了
4,5的t值都为0,所以分别放到,1,3
Node3的t值为1放到6位置,前面留空位5,1~4已经被用了
则1~7的权值分配为
4 1 5 2 6 3 7
这样一来,只需要一次深度优先遍历就可以了,然后在权值数组上采用如上方法查找空位填入数字即可。最后按照节点顺序输出权值,就分配好了。这样一来代码比较简单
但是分配权值的这个可以使用线段树来实现。这样代码就比较复杂,而且实现过程和上面也略有不同,解也不同
锻炼一下线段树的实用,代码如下