給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.
input輸入資料的第一行是乙個正整數t(1<=t<=100),代表測試資料的數量.每個測試資料的第一行是乙個正整數n(1<=n<=1000),代表矩形的數量,然後是n行資料,每一行包含四個浮點數,代表平面上的乙個矩形的左上角座標和右下角座標,矩形的上下邊和x軸平行,左右邊和y軸平行.座標的範圍從0到100000.
注意:本題的輸入資料較多,推薦使用scanf讀入資料.
output對於每組測試資料,請計算出被這些矩形覆蓋過至少兩次的區域的面積.結果保留兩位小數.
sample input
2sample output51 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
7.630.00
思路 :
唯一區別於 矩形的面積並的地方 就是他所要的下邊是被兩次重複覆蓋的邊 。
**示例 :
/** author: ry
* created time: 2017/10/24 8:57:44
* file name: 1.cpp
*/#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
const int eps = 3e+5;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
#define max(a,b) a>b?a:b
#define min(a,b) a>b?b:a
#define ll long long
struct seg
po[eps];
double x[eps];
bool cmp(seg a, seg b)
struct node
pre[eps<<2];
void build(int l, int r, int k)
void down(int k)
void update(int l, int r, int k, int pt)
int m = (pre[k].l + pre[k].r) >> 1;
// 這個地方當時寫完有乙個bug ,一頓找啊 我是,就是自己寫線段樹,習慣了 l , m , k<<1 這樣的引數傳遞,實則不然
if (l <= m) update(l, r, k<<1, pt);
if (r > m) update(l, r, k<<1|1, pt);
down(k);
}int main()
sort(x+1, x+k);
sort(po+1, po+k, cmp);
int t = 2;
for(int i = 2; i < k; i++)
build(1, t-1, 1);
double ans = 0;
for(int i = 1; i < k; i++)
printf("%.2f\n", ans);
}return 0;
}
線段樹矩形面積並,面積交,周長並
include include include include using namespace std const int maxn 2000 10 define lson l,mid,rt 1 define rson mid 1,r,rt 1 1 struct rec rec maxn 2 str...
hdu 1255 覆蓋的面積(線段樹求面積交)
給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.雖說覆蓋兩次區域的面積,但是這道題實際上就是求矩形的面積交。膜拜能夠想出這種解法的神牛,竟然能把實際的東西用這麼抽象的語言表示出來,實在是佩服,現在關於掃瞄線的題才做了幾道,沒有對其深刻理解,但是多練總可以理解的,奮鬥吧!acmer!我是...
線段樹求周長求交面積的做法
求周長的做法是對每個段,用線段樹計算出不相交的區間個數,至於求區間個數,有點像掃瞄線的做法,也是先排序,排序之後就是求括號序列有多少個區間,很有技巧。然後就是段的長度 區間個數 2,然後對矩形座標進行關於y x對稱,再做一次就是完整的周長了。受求周長做法的啟發,可以得到求矩形交面積的做法,需要乙個一...