線段樹 面積交

2022-06-27 09:09:09 字數 1760 閱讀 1739

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

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

思路 :

唯一區別於 矩形的面積並的地方 就是他所要的下邊是被兩次重複覆蓋的邊 。

**示例 :

/*

* 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對稱,再做一次就是完整的周長了。受求周長做法的啟發,可以得到求矩形交面積的做法,需要乙個一...