掃瞄線問題主要利用了線段樹。
因為矩形的並集比較難算,所以我們可以用\(\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 ...