見注釋
//參考
#include
#include
using
namespace std;
const
int n =
205;
struct line
}line[n]
;struct node
tr[n<<2]
;int n, cnt;
double fy[n]
, xx1, xx2, yy1, yy2;
void
build
(int k,
int l,
int r)
void
pushup
(int k,
int l,
int r)
else
if(l == r)
else
if(l != r)
}void
update
(int k,
int l,
int r,
int x,
int y,
int d)
int mid =
(l + r)
>>1;
if(x <= mid)
update
(k <<
1, l, mid, x, y, d);if
(y > mid)
update
(k <<1|
1, mid +
1, r, x, y, d)
;pushup
(k, l, r);}
intfind
(double y)
intmain()
sort
(line +
1, line +1+
2* n)
;//將所有掃瞄線按x值從小到大排序 即從小到大排序
sort
(fy +
1, fy +1+
2* n)
;//將y座標從小到大排序 然後去重 方便離散化後的查詢
cnt =
unique
(fy +
1, fy +1+
2* n)
- fy -1;
build(1
,1, cnt -1)
;//結點數量是cnt-1個 因為葉子結點實際上管理的閉區間大小是2 所以需要減1才能達到l==r的狀態
double ans =0;
for(
int i =
1; i <=
2* n; i++
)printf
("test case #%d\ntotal explored area: %.2lf\n\n"
,++kase, ans);}
}
掃瞄線 線段樹學習筆記
如果仔細觀察掃瞄器工作就會發現,掃瞄器掃瞄時是一條線從頭到尾掃一遍成像。這個演算法形象化表示也是如此。首先是掃瞄線板子題 矩形面積並。題意 在平面直角座標系中,給出若干個矩形,求所有矩形的面積並。太長不看版 對於所有矩形的端點按照縱座標排序,然後依次掃瞄矩形每加入一條線段覆蓋,線段樹查詢所有區間中覆...
線段樹 掃瞄線學習筆記
之後有一回在luogu做了一道同樣求矩形周長的題,用了下面的模板,但是有組資料過不了,需要做如下修改 過載運算子函式修改成 bool operator const p p const p p int xx,int hh,int juu s maxn 1 void upfather int k,int...
線段樹 掃瞄線
pku 1151 hdu1542 atlantis 矩形面積並 題意 給出n個矩形,每個矩形給出左下角座標,右上角座標。然後求矩形並的總面積 思路 浮點數先要離散化 然後把矩形分成兩條邊,上邊和下邊,對橫軸建樹,然後從下到上掃瞄上去,用cnt表示該區間下邊比上邊多幾個,sum代表該區間內被覆蓋的線段...