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行資料,每一行包含四個浮點數,代表平面上的乙個矩形的左上角座標和右下角座標...