題意: 有 n 個矩形,求總的覆蓋面積。
分析: 離散化浮點數座標,以 x 軸 建樹, 將每個矩形拆分成上下兩條線段,從下向上掃瞄。
/**************************************
* 離散化浮點數,把矩形分成上邊和下邊, *
* 按 x 座標建樹,從下向上掃瞄 *
**************************************
*/#include
#include
#include
#include
#define clr(x)memset(x,0,sizeof(x))
using
namespace
std;
const
int maxn=2222
;int cnt[maxn<<2]; //
該區間下邊比上邊多幾個
double sum[maxn<<2]; //
該區間內被覆蓋的線段總長度
double x[maxn]; //
儲存所有 x 座標
struct
node
}s[maxn];
void pushup(int l,int r,int
rt)void update(int l,int r,int c,int l,int r,int
rt)
int m=(l+r)>>1
;
if(l<=m)
update(l,r,c,l,m,rt
<<1
);
if(r>m)
update(l,r,c,m+1,r,rt<<1|1
); pushup(l,r,rt);
}int b_search(double key,int n,double
x)
return -1;}
intmain()
sort(x,x+m);
sort(s,s+m);
k=1;
for(i=1;i)
if(x[i]!=x[i-1
]) x[k++]=x[i];
clr(sum); clr(cnt);
res=0
;
for(i=0;i1;i++)
printf(
"test case #%d\n
",ca++);
printf(
"total explored area: %.2lf\n\n
",res);
}return0;
}
HDU 1542 Atlantis 線段樹 掃瞄線
題意 求二維座標下n個矩陣的面積並 分析 如何求矩陣並的面積呢?如下圖 我們可以利用掃瞄線來做,什麼是掃瞄線?你可以把這些矩陣合併後看做乙個容器 現在你要把這些容器注滿水 很明顯 水先充滿的地方為 更據這樣的思想就可以把原圖分為下面幾個部分惹 那麼如何用 實現呢?我們需要乙個seg結構體儲存x方向線...
hdu 1542 Atlantis(求矩形面積並)
分別記錄x座標和y座標,將其分別按照從左到有的方向排序。然後對於乙個輸入的矩形的x,y座標範圍內的下標進行標記。以兩個相鄰的座標為最小單位分割圖形,最後求總面積。include include include define n 205 int mark n n double a n b n stru...
面積並問題 HDU 1542 Atlantis
hdu 1542 傳送門 題目大意就是幾個矩形相交,然後求出總的覆蓋面積,覆蓋多次的按一次算。典型的面積並問題。大體思路 記錄所給的點,排序,去掉重複的點,對點編號,可以理解成存放點的陣列的下表即為編號。對y軸建立線段樹,利用線段樹計算面積。ac code 1 include 2 include 3...