http://hoj.twbbs.org.tw/judge/problem/view/12
矩形覆蓋面積的經典題,需要思考一下,還頗有趣的。
他的類似題還有矩形周長。
這題想了很久,看了題解後,又想了一段時間才有想法。
基本上,這題分成兩個重點,掃描線跟線段樹。
掃描線的部分,我們把矩形拆成左邊的線跟右邊的線,然後用一條掃描線掃過去,碰到左邊就加上去,碰到右邊就扣掉,就能得到每次往右移動時總共有多少面積被覆蓋,將這個數字乘上向右移動的距離,就是掃過的面積。
可能有點抽像,有附上圖片的說明。
線段樹則是用來維護覆蓋面積,這裡的線段樹有點特化,我想了好久想不出來。
重點是,因為永遠是全域查詢,所以只要確定最後的回傳值是對的就可以了,我用了一個struct當做線段樹的單位。
當更新的範圍覆蓋住左界跟右界時,把tag加上更新值。
完全沒有覆蓋到就直接回傳。
不完全覆蓋時,遞迴下去並把回傳值的和更新到這格的數字。
回傳時,如果tag大於零,代表這個區間被完全覆蓋,回傳右界減左界加一。如果tag等於0,代表區間沒有被覆蓋或是不完全覆蓋,回傳這格記錄的數字。
之後只要把矩形拆開,照X座標排序,依序更新並往右掃描,至於相同X座標不用額外處理,因為位移是0,不影響總和。
1 |
|