題目鏈結
要求矩形的面積並
**不複雜,主要要理解掃瞄線的思想以及一些細節的處理。
首先需要將接收到的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 ...