題意:
求二維座標下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,...