線段樹求面積並公升級版
題目大意:
被矩形覆蓋過兩次的地方的面積
來自大佬的分析:
這題的**在一般的線段樹求面積並的基礎上進行了修改,但是所用的思想是一樣的,所以不難理解
回憶一下一般的求矩形覆蓋面積,線段樹節點裡面有乙個重要的變數,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...