線段樹經典題目 矩形面積

2021-06-16 22:45:46 字數 1411 閱讀 5779

有n(100000)個長方形,並且它的邊長平行於x軸或y軸(範圍50000)。求這n個長方形覆蓋的面積,重疊部分的面積只算一次。

在平面上的一些統計的題目,往往是用線段樹,把x軸作為掃瞄線,然後把y軸對映到線段樹上。這題也是如此:

若座標範圍太大,可以將其離散化,這題不需要。如圖,有兩個矩形。

豎細線作為掃瞄線,把y軸對映到線段樹。在處理每一條掃瞄線的同時,首先統計線段樹中已經被覆蓋的總長度。這一次掃瞄的面積要加上:兩條掃瞄線的之間的差 *  被覆蓋的總長度。

下面是線段樹上的值的變化:

x = 1:0 1 1 1 0 0   被覆蓋總長度:3   

x = 2:0 1 2 2 1 1   被覆蓋總長度:4    面積加上:(2 - 1) * 3

x = 3:0 0 1 1 1 1   被覆蓋總長度:4    面積加上:(3 - 2) * 4

x = 5:0 0 0 0 0 0   被覆蓋總長度:0    面積加上:(5 - 3) * 4

現在需要維護被覆蓋的總長度,我知道有兩種方法:

一是統計線段樹中,等於0的有多少個,記下最小值以維護,然後用y軸的總長度50000減去即可。二是對於線段樹中每個結點所表示的區間被整段覆蓋了多少次,記為cover,如果有乙個操作是將這個區間整段覆蓋(取消覆蓋)一次,那麼cover加一(減一),如果不是整段覆蓋,那麼就遞迴左子樹或右子樹。

#include #include using namespace std;

typedef long long ll;

inline int getint()

while (ch >= '0' && ch <= '9');

return res;

}int n;

const int n = 100007;

const int l = 50007;

struct line

}event[n << 1];

void init()

sort(event, event + (n << 1));

}struct node

inline int mi()

}node[l << 1], *tree = &node[0];

int nnode = 1;

void build(node *&p, int lo, int hi)

}void modify(node *p, int le, int ri, bool ins)

else

}else }

void solve()

printf("%i64d\n", ans);

}int main()

線段樹 矩形面積並

給出n個矩形的左下角和右上角的座標,求矩形面積的並。矩形面積並指的是被矩形覆蓋到的面積和,重疊部分僅算一次。多組輸入,每組首先乙個整數 n,代表矩形的數量 接下來每行四個整數 x1,x2,y1,y2,表示左上角座標 x1,y1 與右下角 x2,y2 每行乙個整數,表示矩形的面積並。input 10 ...

線段樹矩形面積並,面積交,周長並

include include include include using namespace std const int maxn 2000 10 define lson l,mid,rt 1 define rson mid 1,r,rt 1 1 struct rec rec maxn 2 str...

線段樹 平移掃瞄法求矩形面積

t toj 長方形的並的面積 線段樹維護 1 n 全區間大於0的節點的個數即為矩形的長度,線段之間的寬度即為矩形的寬度 for int i 1 ihdu1255 覆蓋的面積 矩形面積交 include include includeusing namespace std const int max ...