點線段樹的應用 售票系統

2021-04-24 02:17:36 字數 705 閱讀 6405

線段樹是一棵平衡二叉樹,又是一棵排序二叉樹。它的深度不超過log2l,區間上的任意一條線段被線段樹分成不超過2log2l條線段。所以線段樹能在o(log2l)的時間內完成一條線段的插入、刪除、查詢等操作。

一棵線段棵的結點所包含的基本資訊包括:區間左、右邊界b和e,區間覆蓋次數c。 根據靜態陣列或動態指標等不同的實現方式,每個結點可能還要包括左、右兒子結果的位址字段。我個人傾向於用類似二叉堆的形式來存放線段樹,因為父結點與子結點之間有乙個簡單的數學關係。

在利用線段樹為工具設計演算法時,往往還需要在結點中包含其它字段。對這些欄位的維護時間複雜性,決定了演算法的成敗。我們說,乙個欄位的值對於線段樹是可維護的,是指對該字段的任何操作(插入、刪除、更新)都在o(log2l)的時間內完成。

點線段樹是指葉結點的區間兩端點相等的線段樹。有時問題中的數量關係存在於區間中的整數「點」上,例如本題中在一段車站區間上的購票申請,其實是落實到具體的某些車站上車的人能否找到位置的問題。這種線段樹在各個層次的相鄰結點的區間端點是不相接的,前後相差1,否則就會存在重複計數問題。因此,在遞迴構建線段樹時,指定左、右兒子的區間範圍時,如果左兒子的右端點設為mid,那麼右兒子的左端點則要設為mid+1。

售票系統這道題的思路還是很簡單的。最直接的做法當前是開乙個陣列直接模擬,但查詢乙個區間能否接受本次購票申請的時間很長,每一次更新成功了的購票申請時的時間也很長。採用線段樹的目的就是用盡可能少的查詢次數就確定接受還是拒絕,以及以盡可能少的操作更新結點資訊。

cogs247 售票系統 線段樹

某次列車途經c個城市,城市編號依次為1到c,列車上共有s個座位,鐵路局規定售出的車票只能是坐票,即車上所有的旅客都有座。售票系統是由計算機執行的,每乙個售票申請包含三個引數,分別用o d n表示,o為起始站,d為目的地站,n為車票張數。售票 系統對該售票申請作出受理或不受理的決定,只有在從o到d的區...

cogs247 售票系統 線段樹

輸入檔案 railway.in 輸出檔案 railway.out 時間限制 1 s 記憶體限制 128 mb 問題描述 某次列車途經c個城市,城市編號依次為1到c,列車上共有s個座位,鐵路局規定售出的車票只能是坐票,即車上所有的旅客都有座。售票系統是由計算機執行的,每乙個售票申請包含三個引數,分別用...

cogs247 售票系統 線段樹

輸入檔案 railway.in 輸出檔案 railway.out 時間限制 1 s 記憶體限制 128 mb 問題描述 某次列車途經c個城市,城市編號依次為1到c,列車上共有s個座位,鐵路局規定售出的車票只能是坐票,即車上所有的旅客都有座。售票系統是由計算機執行的,每乙個售票申請包含三個引數,分別用...