線段樹輔助 掃瞄線法計算矩形周長並(輪廓線)

2021-09-06 08:59:38 字數 1189 閱讀 5521

例題:hdu 1828 picture

有兩種方法,不過常用的第二種,兩種都說一下。

第一種:

把矩形分成橫線和豎線去處理,可知是完全相同的操作,我們來講下怎麼算出橫線部分,豎線部分就是照搬即可。

將橫線儲存在乙個表中,按橫線所處的豎直位置排序(公升序),另外每條橫線帶乙個標記值,原矩形的下線為1,上線為-1(對應過去就是插入線段和刪除線段)

從低到高掃瞄橫線,沒掃到一條橫線就能計算出一部分橫線值。計算方法是算出現在總區間的被覆蓋的長度,然後求出與上一次的總區間的覆蓋長度的差(即相減求絕對值),因為每次新增了一條線段,如果沒有沒有使總區間覆蓋長度發生變化,說明這條線段其實在多邊形的內部,被覆蓋掉了,不能計算,只要能引起總區間長度發生變化的,說明該線段不被覆蓋不被包含,要計算

而豎線部分的做法是一樣的,把豎線儲存在乙個表中,按水平位置排序(公升序),每條橫線帶乙個標記值,原矩形的左線為1,右線為-1,然後同樣地操作

第二種:

上面的方法顯得有點「笨」,相同的工作做了兩次,可不可以只掃瞄一次矩形就求出答案,是可以的,但是我們要改進一下線段樹節點記錄的資訊

每個線段樹的節點要記錄幾個資訊

1.l,r,該節點代表的線段的左右端點座標

2.lp,rp,是乙個標記量,只有0,1,表示這個節點左右兩個端點沒有被覆蓋,有為1,無為0

3.cnt,表示這個區間被重複覆蓋了幾次

4.len,這個區間被覆蓋的長度

5.num,這個區間被多少條線段覆蓋

好像區間[0,10],被[1,2],[4,5]覆蓋,那麼num=2

好像區間[0,10],被[1,3][4,5]覆蓋,那麼num=1,因為他們剛好連在一起了

好像區間[0,10],被[1,5][2,6]覆蓋,那麼num=1,因為還是連起來的一段

前面的工作是相同的,把橫線儲存在乙個表中,按豎直位置排序,然後從下往上掃瞄所有橫線,在這個方法中,每次掃瞄一條橫線,都能計算出兩不部分值,一部分是橫線的,一部分是豎線的

而計算橫線部分的方法和第一種方法是一樣的,即求出【現在這次總區間被覆蓋的長度和上一次總區間被覆蓋的長度的差的絕對值】,另外怎麼算豎線部分呢?首先我們要知道新增了這條橫線後會有多少條豎線,答案是2*num,所以為什麼要記錄num呢,因為總區間被num條線段覆蓋,那麼必定有2*num的端點,這些端點其實就是連著豎線,那麼這些豎線的長度是多少呢?

就是【下一條橫線的高度-現在這條橫線的高度】,只要把這個高度乘上2*num即可

線段樹輔助 掃瞄線法計算矩形面積並

分析 2.重點 掃瞄線法 假想有一條掃瞄線,從左往右 從右往左 或者從下往上 從上往下 掃瞄過整個多邊形 或者說畸形。多個矩形疊加後的那個圖形 如果是豎直方向上掃瞄,則是離散化橫座標,如果是水平方向上掃瞄,則是離散化縱座標。下面的分析都是離散化橫座標的,並且從下往上掃瞄的。掃瞄之前還需要做乙個工作,...

線段樹掃瞄線求矩形周長詳解

oi比賽中掃瞄線是一種很常用的演算法,矩形周長是乙個模板題。題目鏈結 比如,對於下面的三個矩形 想象有一條掃瞄線,從下往上掃瞄完整個圖案,每遇到一條上邊或者下邊就停下來 然後每次停下後對區間進行處理,用乙個ans代表當前周長,最後ans就是答案。首先,要先把矩形拆成上邊和下邊,用1和 1分別代表上邊...

線段樹 掃瞄線

pku 1151 hdu1542 atlantis 矩形面積並 題意 給出n個矩形,每個矩形給出左下角座標,右上角座標。然後求矩形並的總面積 思路 浮點數先要離散化 然後把矩形分成兩條邊,上邊和下邊,對橫軸建樹,然後從下到上掃瞄上去,用cnt表示該區間下邊比上邊多幾個,sum代表該區間內被覆蓋的線段...