hdu 1255 覆蓋的面積(線段樹求面積交)

2021-07-03 17:18:38 字數 2085 閱讀 5184

給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.

雖說覆蓋兩次區域的面積,但是這道題實際上就是求矩形的面積交。

膜拜能夠想出這種解法的神牛,竟然能把實際的東西用這麼抽象的語言表示出來,實在是佩服,現在關於掃瞄線的題才做了幾道,沒有對其深刻理解,但是多練總可以理解的,奮鬥吧!!acmer!!我是永遠不會服輸的。加油!

下面還是附上題解,寫的不夠詳細清楚還請多多見諒。

首先我想說我是看了別人的部落格學了思路,然後按照別人的**來模仿寫的。

這裡推薦:

尤其推薦後面那個人寫的,**風格比較適合初學者閱讀) 5

1 1 4 2

1 3 3 7

2 1.5 5 4.5

3.5 1.25 7.5 4

6 3 10 7

這是根據第乙個樣例畫的圖,我覺得可以跟著**走一遍,然後就會理解了。

然後我們要對線段樹的座標進行離散化,這裡我們也是按照x的大小來建樹。

主要區別是這裡update操作中多了兩個函式pushup1,pushup2。它們分別的作用是向上更新只出現過一次的線段的長度以及向上更新出現兩次及兩次以上的線段的長度。

void pushup1(int v)

}

pushup1函式還是和原來一樣,當cover>0時,那麼len就是整個節點的長度。否則的話,那麼就是左右子樹中len的和(因為我們不用去管左右子樹分別出現過幾次,只需要遞迴求出當前節點的len即可)

void pushup2(int v)

else tree[v].inlen=tree[temp].inlen+tree[temp+1].inlen;

}

pushup2,函式,當cover>=2時,那麼inlen就是當前節點的長度。當cover==1時,這裡我想了很久,為什麼是左右子樹的len加起來就好了呢?後來手動模擬了下,發現如果當前節點cover==1,說明它已經出現過了一次,再加上左右子樹的len,就代表的是它加上的肯定是左右子樹中出現次數》=1的長度,所以再往上覆蓋上去的話,那麼就會發現,tree[v].cover就會大於等於2了。

但是另外最後一種情況就是當前v節點cover==0那麼它就只能加上左右子樹的inlen(也就是出現次數大於等於2的次數的長度

最後我們回溯上去,使父節點tree[1].inlen就是當前區間的高。

**:

#include#include#include#include#includeusing namespace std;

#define maxn 2222

double ym[maxn];

struct nodetree[maxn*4];

struct nnt[maxn];

bool cmp(nn a,nn b)

}void pushup2(int v)

else tree[v].inlen=tree[temp].inlen+tree[temp+1].inlen;

}void build(int l,int r,int v)

void update(int v,struct nn b)

int temp=v<<1;

if(b.y1>=tree[temp].r) update(temp+1,b);

else if(b.y2<=tree[temp+1].l) update(temp,b);

else

pushup1(v);

pushup2(v);

}int main()

sort(ym+1,ym+j);

sort(t+1,t+j,cmp);

build(1,j-1,1);

update(1,t[1]);

double sum=0;

for(int i=2;i//注意這裡迴圈直到j為止

sum+=(t[i].x-t[i-1].x)*tree[1].inlen;

update(1,t[i]);

}printf("%.2lf\n",sum);}}

}

hdu 1255 覆蓋的面積 線段樹

記錄3個變數。sum i 當前區間被覆蓋2次及兩次以上的面積。num i 當前區間被覆蓋1次及一次以上的面積。cover i 覆蓋的lazy標記。對於每乙個區間.更新操作如下 void push up int now if cover rt 1 if cover rt 2 那麼剩下的問題就是簡單的區...

HDU 1255 覆蓋的面積(線段樹求矩形面積交)

題意 給出n個矩形,求出至少被兩塊矩形覆蓋的面積。思路 跟面積並類似的做法,不同的是每個節點要額外維護乙個至少被覆蓋兩次的長度dcnt,此外還是要維護至少覆蓋一次的長度cnt,然後每次由當前結點的cover標記和子節點的dcnt,cnt值來推出當前結點的dcnt,cnt值。include inclu...

HDU 1255 覆蓋的面積 線段樹 掃瞄線

還是先離散化座標,然後用線段樹掃瞄線 其中sum代表被覆蓋過一次的長度,sum2代表被覆蓋過2次及以上的長度。然後注意pushup操作比較麻煩。id sdj22251 prog subset lang c include include include include include include...