區間有關的問題,如記錄一個區間的最值和總量,並在區間的插入,刪除修改中維護這些最值和總量,用線段樹是很方便的。線段樹擁有良好的樹形二分特性。
詳細的概念參考百度百科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
這樣一來,只需要一次深度優先遍歷就可以了,然後在權值數組上採用如上方法查找空位填入數字即可。最後按照節點順序輸出權值,就分配好了。這樣一來代碼比較簡單
但是分配權值的這個可以使用線段樹來實現。這樣代碼就比較複雜,而且實現過程和上面也略有不同,解也不同
鍛鍊一下線段樹的實用,代碼如下