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的線段。跟區間更新啥的還是挺像的,就是那些乙個葉子節點表示乙個點,這個是表...