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

2021-09-13 01:37:02 字數 1309 閱讀 7477

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

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

題解:大神部落格有講解掃瞄線:

#includeusing namespace std;

const int maxn=2011;

double sum1[maxn<<2],sum2[maxn<<2],area;

double x[maxn<<2];

int cnt[maxn<<2];

int t,n,top1,top2;

struct node

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

int mid=(l+r)/2;

if(l<=mid)

update(l,r,v,l,mid,rt*2);

if(r>=mid+1)

update(l,r,v,mid+1,r,rt*2+1);

pushup(l,r,rt);

}void init()

int main()

;//記錄下邊

line[++top2]=(node)

;//記錄上邊

}sort(x+1,x+1+top1);

sort(line+1,line+1+top2);

int k=unique(x+1,x+1+top1)-x-1;

for(int i=1; iprintf("%.2lf\n", area);//用c++的輸出流不對?用c語言的就a了

}return 0;

}

線段樹 覆蓋的面積之和 掃瞄線

先儲存個大佬的模板然後慢慢研究。include include include include include include include include include define inf 99999999 using namespace std const int max 200 10 i...

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

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

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

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