Atlantis(線段樹掃瞄線求面積)

2021-09-26 05:55:38 字數 1716 閱讀 8698

output a blank line after each test case.這裡看到我寫了兩次並且兩次都用了粗體,就應該知道我wa在**了吧。坑哭了,沒看到這細節。還有乙個就是要注意這個是多組樣例的,所以千萬要記得tree陣列要初始化。我和其他人的寫法不太一樣,因為按點寫線段我實在理解不了,也不太會,更看不懂,所以我就直接按照線段寫,即l+1 == r是葉子節點。這樣的話感覺好寫一點。剩下的就是離散化一下了,可以看成乙個板子了。

#include

#include

#include

#include

using namespace std;

const

int maxn =

2e5+5;

double x[maxn]

;int edge_num;

struct edge

}edge[maxn]

;struct node

tree[maxn<<2]

;void

addedge

(double _left,

double _right,

double _height,

int _flag)

void

pushup

(int left,

int right,

int cur)

void

update

(int l,

int r,

int cur,

int _from,

int _to,

int val)

if(l+

1== r)

return

;int mid =

(l+r)

>>1;

if(_from <= mid)

update

(l, mid, cur<<

1, _from, _to, val);if

(_to >= mid)

update

(mid, r, cur<<1|

1, _from, _to, val)

;pushup

(l, r, cur);}

intmain()

printf

("test case #%d\n"

, cas++);

sort

(x+1

, x+1+

(n<<1)

);sort

(edge+

1, edge+

1+edge_num)

;int num =

unique

(x+1

, x+1+

(n<<1)

)-x-1;

double result =

0.0;

for(

int i =

1; i < edge_num; i++

) result +

= tree[1]

.len*

(edge[i+1]

.height-edge[i]

.height);}

printf

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

, result);}

return0;

}

線段樹 掃瞄線

pku 1151 hdu1542 atlantis 矩形面積並 題意 給出n個矩形,每個矩形給出左下角座標,右上角座標。然後求矩形並的總面積 思路 浮點數先要離散化 然後把矩形分成兩條邊,上邊和下邊,對橫軸建樹,然後從下到上掃瞄上去,用cnt表示該區間下邊比上邊多幾個,sum代表該區間內被覆蓋的線段...

掃瞄線 線段樹

問題描述 小明的家旁邊有條河流,但最近,周圍的三個工廠開始向這條河排放汙水,這條河的一部分被汙染了,被乙個工廠汙染的部分可以看做乙個矩形,現在小明想知道這條河被汙染的面積是多少。輸入 第一行乙個整數t,表示有多少組資料,之後每一組資料報括三行,每一行有lx,ly,rx,ry四個整數,表示被乙個工廠汙...

線段樹 掃瞄線

掃瞄線問題主要利用了線段樹。因為矩形的並集比較難算,所以我們可以用 sum 掃瞄線被截長度 所掃瞄的高度 來求和。而這樣做發現可以用線段樹來優化,具體優化方式如下 所掃瞄的高度比較好求,主要是掃瞄線被截長度需要優化。我們可以設橫邊有乙個a權值,如果該邊是矩陣的下邊則設為1,相反就設為 1,這樣如果一...