線段樹 掃瞄法解決矩形的面積並 周長並問題

2021-06-17 00:39:49 字數 817 閱讀 3503

矩形的面積並問題:平面上有n個矩形,各邊均平行於座標軸,求它們覆蓋的總面積(重複覆蓋的只計一次)。

矩形的周長並問題:平面上有n個矩形,各邊均平行於座標軸,求它們覆蓋形成的多邊形的周長。

【演算法】

面積並:

先將所有矩形的上邊界和下邊界作為水平線段記錄下來,並對所有矩形的左右邊界對應的橫座標離散化,設離散化後有n個橫座標,則中間有(n-1)段。對這(n-1)段建立線段樹(注意,仍然和普通線段樹一樣,是雙閉區間,不是網上說的一開一閉),然後,按照縱座標遞增順序掃瞄前面記錄的水平線段(設有m段),對每一段,如果是上邊界,找到其離散化後的範圍(只需找到其左右端點離散化後的值l、r,則對應範圍為[l, r-1]),並插入線段[l, r-1],否則(下邊界),刪除線段[l, r-1]。再然後,線段樹中的每個結點需要記錄該區間內的線段覆蓋的總長度len(若該區間被某條尚未刪除的線段整體覆蓋,則len=總長,否則len=左右子結點len之和),每次操作後,累加面積:t[root].len*該水平線段與下一條水平線段的縱座標之差。

周長並:

類似,只不過由於組成周長的線段有水平的也有豎直的,線段樹結點要記錄的除了len意外還有乙個ss,表示被線段覆蓋的端點數量。另外還有lr和rr兩個bool值,分別表示該線段的左端點和右端點是否被某條插入的線段覆蓋。則t[x].ss = lch(t[x]).ss + rch(t[x]).ss - 2 * (lch(t[x]).rr && rch(t[x].lr)),若該線段被整體覆蓋則t[x].ss=2(兩端點)。最後,這次得到的t[root].len與上次得到的t[root].len之差的絕對值就是水平線段的長度,t[root].ss*縱座標之差就是豎直線段的長度。

**:

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

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

線段樹 平移掃瞄法求矩形面積

t toj 長方形的並的面積 線段樹維護 1 n 全區間大於0的節點的個數即為矩形的長度,線段之間的寬度即為矩形的寬度 for int i 1 ihdu1255 覆蓋的面積 矩形面積交 include include includeusing namespace std const int max ...

線段樹 矩形面積並

給出n個矩形的左下角和右上角的座標,求矩形面積的並。矩形面積並指的是被矩形覆蓋到的面積和,重疊部分僅算一次。多組輸入,每組首先乙個整數 n,代表矩形的數量 接下來每行四個整數 x1,x2,y1,y2,表示左上角座標 x1,y1 與右下角 x2,y2 每行乙個整數,表示矩形的面積並。input 10 ...