2149 矩形周長

2022-05-03 10:12:22 字數 1652 閱讀 7877

usaco

時間限制: 1 s

空間限制: 16000 kb

題目等級 : 大師 master

題解檢視執行結果

n(n<5000) 張矩形的海報,**和其他同樣形狀的貼在牆上。它們的邊都是垂直的或水平的。每個矩形可以部分或者全部覆蓋其他矩形。所有的矩形組成的集合的輪廓稱為周長。寫乙個程式計算周長。

圖 1 是乙個有 7 個矩形的例子:

圖 1.乙個 7 個矩形的集合

對應的輪廓為圖 2 所示的所有線段的集合:

圖 2. 矩形集合的輪廓

所有矩形的頂點座標均為整數。所有的座標都在 [-10000,10000] 的範圍內,並且任何乙個矩形面積都為整數。結果的值可能需要 32 位有符號整數表示。

輸入描述 input description

第1行: n,張貼在牆上的矩形的數目。

第 2..n+1行 接下來的n行中,每行都有兩個點的座標,分別是矩形的左下角座標和右上角座標。每乙個座標由 x 座標和 y 座標組成。

輸出描述 output description

只有一行,為乙個非負整數,表示輸入資料中所有矩形集合的輪廓長度。

樣例輸入 sample input

7

-15 0 5 10

-5 8 20 25

15 -4 24 14

0 -6 16 4

2 15 10 22

30 10 36 20

34 0 40 16

樣例輸出 sample output

228
資料範圍及提示 data size & hint

範圍如題所述

分類標籤 tags 點此展開 

usaco

/*

這道題暴力竟然可以過,可能是資料比較弱,就是把矩形拆成兩條橫邊和縱邊,然後暴力給一條邊上的每乙個點加權值,

如果用線段樹的話,可能是用線段樹維護區間和吧,貌似很麻煩的樣子。

但是這個題有很多細節需要注意(掃瞄線的題大都有很多細節)。

為了使包含關係的邊只出現一次,再加入左邊時,要在區間權值為空(即以前未出現過包含這條邊的邊)時才更新答案,

另外在排序時如果位置相同,把左邊排在前面,這是為了解決兩個矩形前後重合的情況。

*/#include

#include

#include

using

namespace

std;

const

int n=1e4+10

;struct

node

}a[n*2],b[n*2

];int n,m,cnt,f[n*4

];int

main()

sort(a+1,a+cnt+1);sort(b+1,b+cnt+1

);

int ans=0

;

for(int i=1;i<=cnt;i++)

else }}

memset(f,

0,sizeof

f);

for(int i=1;i<=cnt;i++)

else }}

printf("%d

",ans);

return0;

}

矩形周長並

例題 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 ...

POJ 1177 矩形周長並

參考部落格 方法 把矩形分成橫線和豎線去處理,可知是完全相同的操作,我們來講下怎麼算出橫線部分,豎線部分就是照搬即可。將橫線儲存在乙個表中,按橫線所處的豎直位置排序 公升序 另外每條橫線帶乙個標記值,原矩形的下線為1,上線為 1 對應過去就是插入線段和刪除線段 從低到高掃瞄橫線,沒掃到一條橫線就能計...