POJ1389 掃瞄線 線段樹

2021-09-16 18:58:40 字數 1206 閱讀 4618

一道經典的掃瞄線+線段樹求矩形面積並的題目

用線段樹維護y,記錄所有線段被覆蓋的次數和長度,掃瞄線維護x,把乙個長方形拆成兩個事件,左邊界作為+1,右邊界作為-1,即可利用線段樹進行維護。

非離散化版本:

#include#includeusing namespace std;

#define lson k<<1

#define rson k<<1|1

const int maxn=1005;

const int maxm=50005;

struct event

eve[maxn<<1];

bool cmp(const event &a,const event &b)

pushup(k,l,r);

}int main()

sort(eve+1,eve+all+1,cmp);

update(1,0,n,eve[1].y1,eve[1].y2,eve[1].add);

long long ans=0;

for(int i=2;i<=all;i++)

cout<離散化版本:

#include#includeusing namespace std;

#define lson k<<1

#define rson k<<1|1

const int maxn=1005;

const int maxm=50005;

struct event

eve[maxn<<1];

bool cmp(const event &a,const event &b)

pushup(k,l,r);

}int main()

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

sort(id+1,id+2*all+1);

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

sort(eve+1,eve+2*all+1,cmp);

update(1,1,2*all,eve[1].y1,eve[1].y2,eve[1].add);

long long ans=0;

for(int i=2;i<=2*all;i++)

cout《其實是否離散化對於線段樹來說幾乎沒有區別,此處維護線段長度的線段樹與普通維護區間的線段樹不太一樣,在進行分治的時候需要特別注意引數的傳遞。

ACM練級日誌 POJ 1389

這個也是乙個矩形面積並的問題,和1151幾乎一模一樣,不同的是,資料範圍有點不同 1151是100個矩形,每個矩形的座標是小數,而這個是1000個矩形,每個座標在50000以內。50000這個數看上去還可以,連離散化都不用 1151因為是小數所以還必須得離散化 理論上複雜度是2000 log5000...

POJ 1151 線段樹 掃瞄線

cf上遇到一題掃瞄線,二話不說立刻補。該類題目計算座標中邊平行於x,y軸的矩形的覆蓋面積。這樣可以通過離散化x座標,然後建立區間,通過線段樹管理。然後每條掃瞄線更新區間覆蓋和計算面積。對於上面的矩形就有4條掃瞄線,有3個區間。第一條掃瞄線覆蓋1,2區間。第二條掃瞄線覆蓋2,3區間。第三條掃瞄線是第乙...

線段樹 掃瞄線

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