HDU 1255 掃瞄線求面積 離散化

2021-09-20 06:58:02 字數 1464 閱讀 2682

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

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

用線段數維護y軸,每次入邊或出邊時結算面積,要注意離散化

#include #include #include #include #include #include #include #include #include using namespace std;

const int num=4005;

struct point

tree[num*4];

int ll,rr,val;

double interval,cod[num];

struct edge

scanline[2005];

bool cmp(edge a,edge b)

if(tree[k].f) pushdown(k);

int bet=(tree[k].l+tree[k].r)/2;

if(ll<=bet) change(k*2);

if(rr>bet) change(k*2+1);

pushup(k);

}void ask(int k)

return ;

}if(tree[k].f) pushdown(k);

int bet=(tree[k].l+tree[k].r)/2;

if(ll<=bet) ask(k*2);

if(rr>bet) ask(k*2+1);

}int main()

sort(cod,cod+index);

sort(scanline,scanline+index,cmp);

int k=1;

for(int i=1;i

double ans=0;

for(int i=0;i

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

}return 0;

}

覆蓋的面積 HDU 1255(掃瞄線求面積交)

題意 就是掃瞄線求面積交 解析 參考求面積並。就是把down的判斷條件改了一下。由w 0 改為 w 1 同時要討論一下 1 時 的情況,所以就要用到乙個臨時的sum。具體看 把 include include include include include include include inclu...

hdu 1255 覆蓋的面積 掃瞄線

一道挺簡單的題,讓我折騰了許久。主要卡在了更新節點後維護父親節點上。後來思路明確了就很容易了。節點資訊 l,r 區間端點 cnt 區間被覆蓋的次數,cnt 0說明沒有被完全覆蓋。len1 區間被覆蓋的長度 len2 區間至少被兩條線段覆蓋的長度。只要找到父親節點與子節點在len1,len2,cnt的...

HDU 1255 覆蓋的面積 掃瞄線求區間交

思路 在寫這題以前,強烈推薦先寫完hdu1542 然後這題相對於上面一題的區別就在於這題要求的是求覆蓋兩次的面積,上一題只要覆蓋1次的面積.所以總的來說,區別主要是在與push up這個函式上 void push up int rt,int l,int r 注意 好像這個並不用build的 推薦大佬...