HDU 1542 Atlantis 線段樹 掃瞄線

2021-07-30 12:30:21 字數 1218 閱讀 7185

題意:

求二維座標下n個矩陣的面積並

分析:如何求矩陣並的面積呢?如下圖

我們可以利用掃瞄線來做,什麼是掃瞄線?

你可以把這些矩陣合併後看做乙個容器

現在你要把這些容器注滿水

很明顯:水先充滿的地方為:

更據這樣的思想就可以把原圖分為下面幾個部分惹:

那麼如何用**實現呢?

我們需要乙個seg結構體儲存x方向線段 其中有4個引數 h--->線段高度 l--->左起位置  r---->右邊結束   s---->是矩陣的上邊or下邊

///本題還需要對x座標進行離散化

對所有線段排序後

這樣,我們用掃瞄線去掃瞄每一條邊的時候,都需要更新線段樹的有效長度

是如何更新的呢?

如果掃到的這條邊是某矩形的下邊,則往區間插入這條線段

如果掃到的這條邊是某矩形的上邊,則往區間刪除這條線段

每掃乙個邊就算一下當前的矩陣的面積 ans+=sum[1]*(ss[i+1].h-ss[i].h);

accode:

#include #define maxn 222

#define tmp (st<<1)

#define mid ((l+r)>>1)

#define lson l,mid,tmp

#define rson mid+1,r,tmp|1

using namespace std;

int cnt[maxn<<2];

double sum[maxn<<2];

double x[maxn];

struct seg

seg(double a,double b,double c,int d):l(a),r(b),h(c),s(d){}

bool operator

int main()

sort(x,x+m);

sort(ss,ss+m);

for(int i=0;i

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

HDU 1542 Atlantis 矩形面積並

題意 有 n 個矩形,求總的覆蓋面積。分析 離散化浮點數座標,以 x 軸 建樹,將每個矩形拆分成上下兩條線段,從下向上掃瞄。離散化浮點數,把矩形分成上邊和下邊,按 x 座標建樹,從下向上掃瞄 include include include include define clr x memset x,...