在乙個二維座標平面中,有 n 個矩形,每個矩形的邊都是平行於 x 軸或 y 軸的。給定這 n 個矩形的位置,這 n 個矩形之間可以相互覆蓋。
求這 n 個矩形所組成的圖形的周長是多少。
輸入格式
第一行輸入乙個整數 n,表示平面中矩形的數量。(1≤n≤50000)
接下來 n 行,每行四個整數 x1, y1, x2, y2 表示每個矩形左下角的座標和右上角的座標。
線段樹+離散化+掃瞄法
#include
#include
#include
#include
#include
using namespace std;
const
int n=
50010
;struct node
}}line[n<<1]
;struct ndtree[n<<3]
;map<
int,
int> mp;
//線段的橫座標集合對映為他們在陣列中的下標
int x[n<<1]
;//儲存所有線段的橫座標
void
build
(int p,
int l,
int r)
void
pushup
(int p,
int l,
int r)
else
if(l==r)
else
}void
modify
(int p,
int l,
int r,
int s,
int e,
int f)
int mid=
(l+r)
>>1;
if(s<=mid)
//當前線段覆蓋了該節點的左孩子所代表的部分區間
modify
(p<<
1,l,mid,s,e,f);if
(e>mid)
//當前線段覆蓋了該節點的右孩子所代表的部分區間
modify
(p<<1|
1,mid+
1,r,s,e,f)
;pushup
(p,l,r)
;//更新當前節點資訊
}int
main()
sort
(x,x+n+n)
;//排序
m=unique
(x,x+n*2)
-x;//去重
for(
int i=
0;i)sort
(line,line+
2*n)
;//將線段排序
build(1
,1,m);
long
long ans=0;
long
long last=0;
for(
int i=
0;i<
2*n;i++
) ans+
=t;modify(1
,1,m,mp[line[i]
.x1]
,mp[line[i]
.x2]-1
,line[i]
.f);
int t1=
abs(last-tree[1]
.len)
;//橫線的長度
ans+
=t1;
last=tree[1]
.len;
//printf("t=%d t1=%d ans=%lld\n",t,t1,ans);
}printf
("%lld\n"
,ans)
;return0;
}
矩形的面積並 計蒜客
在乙個二維座標平面中,有 n 個矩形,每個矩形的邊都是平行於 x 軸或 y 軸的。給定這 n 個矩形的位置,這 n 個矩形之間可以相互覆蓋。求這 n 個矩形所占用的平面總面積是多少。輸入格式 第一行輸入乙個整數 n,表示平面中矩形的數量。1 n 50000 接下來 n 行,每行四個整數 x1,y1,...
矩形周長並
例題 hdu1828 題意 裸題 include using namespace std define lson rt 1 define rson rt 1 1 const int maxn 10005 const int inf 1e9 7 struct node node int x1,int ...
矩形周長並,矩形面積並,矩形面積交
目錄 矩形周長並 矩形面積並 矩形面積交 includeusing namespace std const int maxn 50004 2 struct nodesegtree maxn 2 struct lineline maxn bool cmp line a,line b void cal ...