掃瞄線 線段樹

2021-09-24 20:07:57 字數 1558 閱讀 9678

問題描述

小明的家旁邊有條河流,但最近,周圍的三個工廠開始向這條河排放汙水,這條河的一部分被汙染了,被乙個工廠汙染的部分可以看做乙個矩形,現在小明想知道這條河被汙染的面積是多少。

輸入

第一行乙個整數t,表示有多少組資料,之後每一組資料報括三行,每一行有lx, ly, rx, ry四個整數,表示被乙個工廠汙染的矩形的左下角與右上角,保證每個數都在[-100000,100000]之間,lx

輸出

對於每組資料輸出一行,每行乙個整數表示被汙染的面積。

樣例輸入1

1 1 4 4

3 2 6 3

5 1 8 4

樣例輸出19

思路。這題很簡單,就是簡單的容斥原理即可

#include #include #include using namespace std;

#include struct point

point(){}

};typedef long long ll;

struct rect

rect(point a, point b) : l(a), r(b) {}

ll area()

rect getit(rect s)

};int main(void)

return 0;

同時,這題還可以用掃瞄線的方法來做:

講的通俗易懂

#include#include#includeusing namespace std;

const int maxn = 10000;

struct line;

line(int ll,int rr,int h,int c):ll(ll),rr(rr),h(h),c(c){};

bool operator<(const line &b)

if(tree[root].rr - tree[root].ll == 1)

update(root*2 , ll, rr, cover);

update(root*2+1 ,ll, rr, cover);

}int query(int root, int ll, int rr)

if(tree[root].rr - tree[root].ll == 1) return 0;

int ans =0;

ans += query(root *2, ll, rr);

ans += query(root*2+1, ll, rr);

return ans;

} int main()

sort(x_ind+1,x_ind+j+1);

sort(lines+1,lines+kk+1);

int q=1;

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

x_ind[0] = q;

create(1,1,q);

int ans =0;

for(int i=1;i

線段樹 掃瞄線

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

線段樹 掃瞄線

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

線段樹 掃瞄線

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