HDU 1255 覆蓋的面積(線段樹 掃瞄線)

2021-07-11 15:12:20 字數 1911 閱讀 8545

c - 覆蓋的面積

time limit:5000msmemory limit:32768kb64bit io format:%i64d & %i64u

submit

status

practice

hdu 1255

system crawler  (2016-04-30)

description

給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積. 

input

輸入資料的第一行是乙個正整數t(1<=t<=100),代表測試資料的數量.每個測試資料的第一行是乙個正整數n(1<=n<=1000),代表矩形的數量,然後是n行資料,每一行包含四個浮點數,代表平面上的乙個矩形的左上角座標和右下角座標,矩形的上下邊和x軸平行,左右邊和y軸平行.座標的範圍從0到100000. 

注意:本題的輸入資料較多,推薦使用scanf讀入資料. 

output

對於每組測試資料,請計算出被這些矩形覆蓋過至少兩次的區域的面積.結果保留兩位小數. 

sample input

2

51 1 4 2

1 3 3 7

2 1.5 5 4.5

3.5 1.25 7.5 4

6 3 10 7

30 0 1 1

1 0 2 1

2 0 3 1

sample output

7.63

0.00

ac**:

/*

這題一開始是想找題解的,所以當我找了題解後,發現

有人一樣是不會做這個的,只做了面積並,而且他yy過了

所以我也決定要yy過它,所以就沒有看題解了。沒想到

過了一晚時間就讓我yy過了,哈哈!!

*/#include#include#include#include#includeusing namespace std;

#define t 10005

#define lson (rt<<1)

#define rson (rt<<1|1)

typedef long long ll;

int n;

//離散化陣列

double pos[t];

//儲存y在x區間的邊

struct line

else if(tree[rt].l+1==tree[rt].r)

else//跨越幾個區間合併值 }

/*這題與面積並相像,只是多了乙個向下更新,之所以要向下

更新是因為,我要的是單個區間都要有值

*/void pushdown(int rt)

}//建樹

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

}//更新

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

pushdown(rt);

if(r<=tree[rt].mid)

update(lson,l,r,w);

else if(l>=tree[rt].mid)

update(rson,l,r,w);

else

pushup(rt);

}int main()

{#ifdef zsc

freopen("input.txt","r",stdin);

#endif

int i,c,n;

double x1,x2,y1,y2;

scanf("%d",&n);

while(n--)

{ scanf("%d",&n);

c = 0;

for(i=0;i

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...