1. 掃瞄線演算法
1)原理:
平面掃瞄線演算法通常由掃瞄線、事件點、當前掃瞄事件點集合構成:通過掃瞄線按照某一方向依次掃瞄,掃瞄事件點,檢查事件點狀態,然後新增或刪除事件點以更新事件點集合。
2)看一道經典的問題:
lintcode391. 數飛機
給出飛機的起飛和降落時間的列表,用 interval 序列表示. 請計算出天上同時最多有多少架飛機?
這道題看起來很簡單,但是我的做法超時了:
publicclass
solution
int timepoint = new
int[maxtime + 1];
for (int i = 1; i <= maxtime; i++)
}timepoint[i] =showtime;
}int res =integer.min_value;
for (int i = 1; i <= maxtime; i++)
return
res;
}}
這個解法是很細粒度的掃瞄,就是每個時刻都要掃瞄一次,所以當最長事件很大時,我開的資料就很大,就需要掃瞄很長的陣列。
那麼可否粗粒度的掃瞄呢?答那是可以的,就是只需要檢查起點和終點。因為一段時間的構成就是起點和終點,那麼涉及到事件點集合的變化就是起點的出現和終點的出現。
那麼具體是如何變化的呢?想一想,如果乙個起點出現,會發生什麼,就說明當前時刻又有乙個時間段出現了,如果終點出現,就說明當前時刻結束了乙個時間段。
那麼我們可以維護乙個count,來記錄實時事件點的變化。 當起點出現,count++;終點出現count--;哈,前提是這些時間段應該順序排列。
ok,按這個思路改了**,ac
publicclass
solution
}public
int countofairplanes(listairplanes)
collections.sort(points,
new comparator()
});int res = 0, count = 0;
for(point point : points)
return
res;
}}
線段樹掃瞄線(2 算矩形的相交面積)
hdu 1255 首先感謝一下 titanium 從他的部落格中得到了思路 怎麼計算出重複的面積。我們先規定sum2 為 至少出現1次時統計的長度 sum為至少出現2次時的長度 如果某個區間的cnt 2 那麼 就表示這個這個區間的所有長度都是有效長度,sum就等於這個區間的總長度 當cnt 1時,表...
高階資料結構 線段樹
今天是很沉重的一天,進來ccf官宣取消oi,也不知道是不是真的。oier們不要放棄夢想!大家一定要勇往直前!這線段樹會很難 至少我是這麼想的 不過我也是經過百般實驗才敢寫這個部落格!假定我給你乙個定區間,讓你以最快的速度做這樣的操作 修改其中的乙個子區間,查詢另乙個子區間的值,而且重複這些操作。你會...
C 線段樹 高階資料結構
線段樹是一種平衡二叉搜尋樹 完全二叉樹 它將乙個線段區間劃分成一些單元區間。對於線段樹中的每乙個非葉子節點 a,b 他的左兒子表示的區間為 a,a b 2 右兒子表示的區間為 a b 2 1,b 最後的葉子節點數目為n,與陣列下標對應。線段樹的一般包括建立 查詢 插入 更新等操作,建立規模為n的時間...