HDU 1255 線段樹,掃瞄線,矩形的面積交)

2021-07-16 17:58:41 字數 2081 閱讀 8497

description

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

input

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

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

output

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

sample input

2 5

1 1 4 2

1 3 3 7

2 1.5 5 4.5

3.5 1.25 7.5 4

6 3 10 7

3 0 0 1 1

1 0 2 1

2 0 3 1

sample output

7.63

0.00

思路:

同矩形的面積並一樣,先自下往上掃面,矩形的下邊狀態設為1,上邊的狀態為-1,每次更新線段樹的乙個區間時都要更新到葉子節點,這樣在計算整個區間上的和時只統計狀態數大於等於2的葉子節點就好了。**如下:

#include 

#include

using

namespace

std;

#define lroot 2*root+1

#define rroot 2*root+2

const

int max_n=5000;

struct line

line(double lx,double rx,double hh,int s):l(lx),r(rx),h(hh),sta(s){}

bool

operator

double x[2*max_n];

int search(double key,double x,int m)

return -1;

}void pushdown(int root,int left,int right)

else

if(segtree[root].vis!=0)

}void update(int root,const

int &sta,int nleft,int nright,const

int &uleft,const

int &uright)

update(lroot,sta,nleft,mid,uleft,uright);

update(rroot,sta,mid+1,nright,uleft,uright);

segtree[root].sum=segtree[lroot].sum+segtree[rroot].sum;

}int main()

double x1,x2,y1,y2;int k=0;

for (int i=0;iscanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);

line[k]=line(x1,x2,y1,1);

x[k++]=x1;//離散化x的範圍

line[k]=line(x1,x2,y2,-1);

x[k++]=x2;

}sort(x,x+k);

sort(line,line+k);

int m=0;

x[m++]=x[0];

for(int i=0;i1;i++)//去重

if(x[i]!=x[i+1])x[m++]=x[i+1];

double ans=0;

for (int i=0;iint l=search(line[i].l,x,m);

int r=search(line[i].r,x,m)-1;

update(0,line[i].sta,0,m-1,l,r);

ans+=segtree[0].sum*(line[i+1].h-line[i].h);

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

hdu 1255 掃瞄線 線段樹計算矩形面積並

題目 題意 給你n個矩形,要你計算這些矩形被覆蓋兩次以上部分的面積和。做法 剛學的掃瞄線,留個板子和參考鏈結,很多地方容易出細節問題。include define lson rt 1 define rson rt 1 1 using namespace std const int maxn 1005...

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

還是先離散化座標,然後用線段樹掃瞄線 其中sum代表被覆蓋過一次的長度,sum2代表被覆蓋過2次及以上的長度。然後注意pushup操作比較麻煩。id sdj22251 prog subset lang c include include include include include include...

hdu 1255 覆蓋的面積 線段樹 掃瞄線

一直想搞線段樹的掃瞄線,這道題算是入門了吧。這題需要用到 離散化,因為座標是浮點數。還有就是線段樹中的掃瞄線的知識,另外,這題需要求重複的面積和,所以在運用線段樹的時候需要更新到葉子節點。每乙個葉子節點儲存的是離散化後長度為1的線段。跟區間更新啥的還是挺像的,就是那些乙個葉子節點表示乙個點,這個是表...