線段樹掃瞄線 學習筆記

2021-10-09 16:46:22 字數 1440 閱讀 5925

見注釋

//參考 

#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代表該區間內被覆蓋的線段...