HDU 1255 覆蓋的面積

2021-09-11 05:25:30 字數 1632 閱讀 6828

problem description

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

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

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

output

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

sample input

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

0 0 1 1

1 0 2 1

2 0 3 1

sample output

7.63

0.00

思路:類似hdu1542

需要改動的是:

1:當乙個子線段原來的flag為1,並且新的flag為1時,記錄底邊的高度;

2:當乙個子線段原來的flag為2,並且新的flag為-1時,計算重疊區域的面積。

#include #include #include using namespace std;

typedef long long ll;

const int maxn = 2005;

double area = 0;

double x[maxn];

struct line

line[maxn];

struct node

node[maxn << 2];

bool cmp(const line &a, const line &b)

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

node[rt].end = false;

int mid = l + (r - l) / 2;

build(rt << 1, l, mid);

build(rt << 1 | 1, mid, r);

}void update(int rt, double l, double r, int flag, double y)

if (node[rt].end)

else if ((node[rt].flag == 1) && (flag == 1))

node[rt].flag += flag;

} else }

int main()

sort(x, x + count + 1);

sort(line, line + count + 1, cmp);

build(1, 0, count);

for (int i = 0; i <= count; i++)

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

} return 0;

}

hdu 1255 覆蓋的面積

與poj1151略有不同 由於是大於等於2 的有效 所以應該更新到點 include include include include include include include include include includeusing namespace std define inf 0x3f3...

HDU 1255 覆蓋的面積

題目鏈結點這裡 這道題,很久以前做過,當時寫了個暴力,居然過了,然後一直想寫下線段樹的,結果一直被各種事搞得忘了。現在終於填坑了。include include include includeusing namespace std define mem x,y memset x,y,sizeof x...

HDU 1255 覆蓋的面積

題目 給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.input 輸入資料的第一行是乙個正整數t 1 t 100 代表測試資料的數量.每個測試資料的第一行是乙個正整數n 1 n 1000 代表矩形的數量,然後是n行資料,每一行包含四個浮點數,代表平面上的乙個矩形的左上角座標和右下角座標...