矩形的周長並 計蒜客

2021-09-10 13:08:21 字數 1908 閱讀 3977

在乙個二維座標平面中,有 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 ...