線段樹總結

區間有關的問題,如記錄一個區間的最值和總量,並在區間的插入,刪除修改中維護這些最值和總量,用線段樹是很方便的。線段樹擁有良好的樹形二分特性。

詳細的概念參考百度百科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

 

這樣一來,只需要一次深度優先遍歷就可以了,然後在權值數組上採用如上方法查找空位填入數字即可。最後按照節點順序輸出權值,就分配好了。這樣一來代碼比較簡單

 

但是分配權值的這個可以使用線段樹來實現。這樣代碼就比較複雜,而且實現過程和上面也略有不同,解也不同

鍛鍊一下線段樹的實用,代碼如下

 

 

 

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