hdu1542線段樹(掃瞄線 離散化)

2022-08-15 06:51:16 字數 1697 閱讀 7298

題目鏈結

要求矩形的面積並

**不複雜,主要要理解掃瞄線的思想以及一些細節的處理。

首先需要將接收到的x座標離散化,方法就是排序去重。接下來的線段樹建立在這個

關於x座標的陣列上,這很關鍵。線段樹的節點代表一段區間,這個區間是由x座標陣列的下標

來構成的。更新的時候就根據水平線段的左右x座標獲得區間,然後更新區間。

看了這麼多,離散化之後關於r+1,r-1的問題還是很模糊。

我盡力理解一下,有乙個[0,4]的區間,葉節點分別為[0,0],[1,1],[2,2],[3,3],[4,4],

那麼[0,0]節點表示的是區間[0,1];[1,1]節點表示的區間[1,2];[2,2]節點表示的區間[2,3];[3,3]節點表示區間[3,4];

當向上傳遞時[0,1]節點表示區間[0,2],以此類推

#include#include

#include

using

namespace

std;

const

int maxn=110;//

最多矩形個數

struct

seg seg(

double lx_,double rx_,double y_,short

f_):lx(lx_),rx(rx_),y(y_),f(f_){}

bool

operator

<(const seg &a)const

};int

sgsnum;

seg sgs[maxn*2

];int

x2nnum;

//x2n

double x2n[maxn*2

];double len[maxn*8

];int num[maxn*8

];void build(int root,int l,int

r)void pushup(int root,int l,int

r)else

if(l==r)

else

}void update(int root,int l,int r,int f,int l,int

r)

int mid=l+(r-l)/2

;

if(l<=mid)update(root*2

,l,r,f,l,mid);

if(mid2+1,l,r,f,mid+1

,r);

pushup(root,l,r);

}int bin(double

k)

return -1;}

intmain()

double area=0

; sort(x2n,x2n+x2nnum);

sort(sgs,sgs+sgsnum);

x2nnum=unique(x2n,x2n+x2nnum)-x2n;

build(

1,0,x2nnum-1

);

for(int i=0;i1;i++)

printf(

"test case #%d\n

",p);

printf(

"total explored area: %.2lf\n\n

",area);

}//while(1);

}

參考資料

HDU 1542 線段樹 離散化 掃瞄線

題意 給你n個矩形的左上角頂點與右下角頂點,求 n個矩形的面積和 可能重疊,重疊的部分只算一次 思路 掃瞄線模版題。關於掃瞄線建議看這個部落格 還有乙個比較重要的問題,一般的線段樹以及我們的區間修改合併,都有乙個共同點,就是不會出現區間缺失的現象,什麼叫區間缺失,顧名思義,區間缺失就是缺少一些區間沒...

hdu1542(線段樹 掃瞄線)

裸的掃瞄線,學習掃瞄線的題目。具體掃瞄線的原理我不講了,我是看大神們的部落格懂得,就算寫也沒大神屌。下面我給出我的 裡面的注釋是我認為比較重要的地方 include include include includeusing namespace std const int max 210 int n ...

hdu 1542 掃瞄線 線段樹

題目大意 求矩形面積的並 思路 按y軸排序,然後將x投影到線段樹上做乙個線段覆蓋問題即可 注意 為了避免重複,線段座標右端點是開區間,更新時需要加上1 include include include include include define fo i,a,b for int i a i b i ...