线段树总结

区间有关的问题,如记录一个区间的最值和总量,并在区间的插入,删除修改中维护这些最值和总量,用线段树是很方便的。线段树拥有良好的树形二分特性。

详细的概念参考百度百科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

 

这样一来,只需要一次深度优先遍历就可以了,然后在权值数组上采用如上方法查找空位填入数字即可。最后按照节点顺序输出权值,就分配好了。这样一来代码比较简单

 

但是分配权值的这个可以使用线段树来实现。这样代码就比较复杂,而且实现过程和上面也略有不同,解也不同

锻炼一下线段树的实用,代码如下

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章