分析:
2.重點:掃瞄線法:假想有一條掃瞄線,從左往右(從右往左),或者從下往上(從上往下)掃瞄過整個多邊形(或者說畸形。。多個矩形疊加後的那個圖形)。如果是豎直方向上掃瞄,則是離散化橫座標,如果是水平方向上掃瞄,則是離散化縱座標。下面的分析都是離散化橫座標的,並且從下往上掃瞄的。
掃瞄之前還需要做乙個工作,就是儲存好所有矩形的上下邊,並且按照它們所處的高度進行排序,另外如果是上邊我們給他乙個值-1,下邊給他乙個值1,我們用乙個結構體來儲存所有的上下邊
struct segment
接著掃瞄線從下往上掃瞄,每遇到一條上下邊就停下來,將這條線段投影到總區間上(總區間就是整個多邊形橫跨的長度),這個投影對應的其實是個插入和刪除線段操作。還記得給他們賦的值1或-1嗎,下邊是1,掃瞄到下邊的話相當於往總區間插入一條線段,上邊-1,掃瞄到上邊相當於在總區間刪除一條線段(如果說插入刪除比較抽象,那麼就直白說,掃瞄到下邊,投影到總區間,對應的那一段的值都要增1,掃瞄到上邊對應的那一段的值都要減1,如果總區間某一段的值為0,說明其實沒有線段覆蓋到它,為正數則有,那會不會為負數呢?是不可能的,可以自己思考一下)。
每掃瞄到一條上下邊後並投影到總區間後,就判斷總區間現在被覆蓋的總長度,然後用下一條邊的高度減去當前這條邊的高度,乘上總區間被覆蓋的長度,就能得到一塊面積,並依此做下去,就能得到最後的面積
(這個過程其實一點都不難,只是看文字較難體會,建議紙上畫圖,一畫即可明白,下面獻上一圖希望有幫組)
線段樹輔助 掃瞄線法計算矩形周長並(輪廓線)
例題 hdu 1828 picture 有兩種方法,不過常用的第二種,兩種都說一下。第一種 把矩形分成橫線和豎線去處理,可知是完全相同的操作,我們來講下怎麼算出橫線部分,豎線部分就是照搬即可。將橫線儲存在乙個表中,按橫線所處的豎直位置排序 公升序 另外每條橫線帶乙個標記值,原矩形的下線為1,上線為 ...
hdu 1255 掃瞄線 線段樹計算矩形面積並
題目 題意 給你n個矩形,要你計算這些矩形被覆蓋兩次以上部分的面積和。做法 剛學的掃瞄線,留個板子和參考鏈結,很多地方容易出細節問題。include define lson rt 1 define rson rt 1 1 using namespace std const int maxn 1005...
線段樹 平移掃瞄法求矩形面積
t toj 長方形的並的面積 線段樹維護 1 n 全區間大於0的節點的個數即為矩形的長度,線段之間的寬度即為矩形的寬度 for int i 1 ihdu1255 覆蓋的面積 矩形面積交 include include includeusing namespace std const int max ...