線段樹 掃瞄線

2022-03-17 17:06:51 字數 1220 閱讀 3282

掃瞄線問題主要利用了線段樹。

因為矩形的並集比較難算,所以我們可以用\(\sum\)(掃瞄線被截長度×所掃瞄的高度)來求和。而這樣做發現可以用線段樹來優化,具體優化方式如下:所掃瞄的高度比較好求,主要是掃瞄線被截長度需要優化。

我們可以設橫邊有乙個a權值,如果該邊是矩陣的下邊則設為1,相反就設為-1,這樣如果一段區間(如果該區間正好與橫邊對應的話至少會對應兩個邊)的沒有被截(或者說已經掃過去,加入答案中去了)則此時該區間所對應的線段樹的a權值和一定為0.

相反,如果該區間已經被掃瞄線掃進去且會更新答案的話,則a權值一定不為0。

最後答案加上總區間被覆蓋長度的值的和乘高度差。

#include #define int long long

#define ls l, mid, root << 1

#define rs mid + 1, r, root << 1 | 1

using namespace std;

int n, cnt, _x1, _x2, _y9, _y3, x[1001000], sum;

struct g

}data[1001000];

struct node ans[4001000];

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

inline void pushup(int root)

void update(int ql, int qr, int root, int add)

update(ql, qr, root << 1, add);

update(ql, qr, root << 1 | 1, add);

pushup(root);

}signed main()

//離散化

sort(data + 1, data + 1 + cnt);//離散化首先需要排序+去重

sort(x + 1, x + 1 + cnt);

int block = unique(x + 1, x + 1 + cnt) - (x + 1);

build(1, block - 1, 1); //block-1就可以包含所有的區間了。建樹時的都是離散化之後的點

for (int i = 1; i < cnt; i++)

printf("%lld", sum);

return 0;

}

線段樹 掃瞄線

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

掃瞄線 線段樹

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

線段樹 掃瞄線

這其實是計算幾何的一部分。一般被用來解決圖形面積 周長等問題。求給定的 n 個矩形的面積並 如圖 從左到右掃 若乙個矩形的左下頂點座標為 x 1,y 1 右上頂點座標為 x 2,y 2 模板 includeusing namespace std define int long long const ...