HDU1255覆蓋的面積 線段樹 離散化 掃瞄線

2021-07-28 18:02:14 字數 2048 閱讀 9113

線段樹求面積並公升級版

題目大意:

被矩形覆蓋過兩次的地方的面積

來自大佬的分析:

這題的**在一般的線段樹求面積並的基礎上進行了修改,但是所用的思想是一樣的,所以不難理解

回憶一下一般的求矩形覆蓋面積,線段樹節點裡面有乙個重要的變數,cnt。這個變數表示了該節點表示的區間被完全覆蓋,如果cnt=0,說明沒有被完全覆蓋(但不代表沒有被覆蓋),要算出該節點所代表的區間被覆蓋的長度,需要由它左右孩子節點被覆蓋的長度相加所得。如果cnt=1,表示被完全覆蓋,覆蓋長度就是該區間長度。如果cnt>1說明也是被完全覆蓋,不過不止覆蓋了一次,在算覆蓋長度的時候,和cnt=1的計算方法是一樣的。注意一點,節點裡還有另乙個變數len,就是該區間被覆蓋的長度,但是我們注意一下,這個len準確的意義應該是,被覆蓋了一次或以上的長度,只是這個意義在一般的求面積問題中,不需要過分強調

我們是怎麼計算最後的面積的?一樣的道理,從下往上掃瞄矩形,每次新增一條矩形上下邊,然後看看t[1].ss是多少,再乘上高度差。因為t[1]表示了總區間,而ss表示被覆蓋兩次或以上的長度,即計算時我們忽略掉只被覆蓋一次的長度

問題的關鍵變為怎麼計算乙個節點的ss

分情況討論

1.cnt>1 : 說明該區間被覆蓋兩次或以上,那麼長度就可以直接計算,就是該區間的長度

剩下的情況就是cnt=1或cnt=0

2.先看葉子節點,因為是葉子沒有孩子了,所以被覆蓋兩次貨以上的長度就是0(無論cnt=1或cnt=0都是0,因為是葉子。。。)

3.不是葉子節點 ,且cnt=1.注意這裡,cnt=1確切的意義是什麼,應該是,可以確定,這個區間被完全覆蓋了1次,而有沒有被完全覆蓋兩次或以上則不知道無法確定,那麼怎麼怎麼辦了,只要加上t[lch].s + t[rch].s  即,看看左右孩子區間被覆蓋了一次或以上的長度,那麼疊加在雙親上就是雙親被覆蓋兩次或以上的長度

3.不是葉子節點,且cnt=0,確切的意義應該是不完全不知道被覆蓋的情況(不知道有沒有被覆蓋,被覆蓋了幾次,長度是多少都不知道),這種情況,只能由其左右孩子的資訊所得

t[lch].ss + t[rch].ss  , 即直接將左右孩子給覆蓋了兩次或以上的長度加起來,這樣才能做到不重不漏

#include#include#include#includeusing namespace std;

const int maxn = 1010;

double pos[maxn*2];

struct segment

ss[maxn<<1];

struct node

segtree[maxn<<3];

bool cmp(segment p, segment q)

void build(int l, int r, int rt)

int binary(double key, int low, int high)

}void cal(int rt)

void update(int l, int r, int val, int rt)

int mid = (segtree[rt].l + segtree[rt].r) >> 1;

if(r <= mid)

update(l, r, val, rt<<1);

else if(l > mid)

update(l, r, val, (rt<<1)|1);

else

cal(rt);

}int main()

sort(pos, pos+nums);

sort(ss, ss+nums, cmp);

int m = 1;

for(int i = 1; i < nums; i++)

if(pos[i] != pos[i-1])

pos[m++] = pos[i];

build(0, m-1, 1);

//cout << "yes\n";

double ans = 0;

for(int i = 0; i < nums-1; i++)

printf("%.2f\n", ans);

}return 0;

}

hdu 1255 覆蓋的面積 線段樹

記錄3個變數。sum i 當前區間被覆蓋2次及兩次以上的面積。num i 當前區間被覆蓋1次及一次以上的面積。cover i 覆蓋的lazy標記。對於每乙個區間.更新操作如下 void push up int now if cover rt 1 if cover rt 2 那麼剩下的問題就是簡單的區...

hdu 1255 覆蓋的面積(線段樹求面積交)

給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.雖說覆蓋兩次區域的面積,但是這道題實際上就是求矩形的面積交。膜拜能夠想出這種解法的神牛,竟然能把實際的東西用這麼抽象的語言表示出來,實在是佩服,現在關於掃瞄線的題才做了幾道,沒有對其深刻理解,但是多練總可以理解的,奮鬥吧!acmer!我是...

HDU 1255 覆蓋的面積(線段樹求矩形面積交)

題意 給出n個矩形,求出至少被兩塊矩形覆蓋的面積。思路 跟面積並類似的做法,不同的是每個節點要額外維護乙個至少被覆蓋兩次的長度dcnt,此外還是要維護至少覆蓋一次的長度cnt,然後每次由當前結點的cover標記和子節點的dcnt,cnt值來推出當前結點的dcnt,cnt值。include inclu...