hdu 1542 線段樹 掃瞄線 學習

2022-05-25 18:30:13 字數 2130 閱讀 6825

學習掃瞄線ing...

玄學的東西...

掃瞄線求面積的主要思想就是對乙個二維的矩形的某一維上建立一棵線段樹,然後把另一維按高度排序,從下向上列舉即可。

主題思想其他部落格說的很明白了,這裡重點記錄一下細節問題:

下面認為對橫座標建立線段樹掃瞄縱座標:

首先,由於讀入的都是浮點數,所以我們需要對這個東西離散化,具體做法是先去重再進行二分查詢,以下標代替浮點數值。

其次,由於普通線段樹維護的是乙個散點區間,而這裡我們需要維護一整個連續的區間,所以區間的端點就是有說道的。具體來講,我們採用乙個「左閉右開」的區間,如何維護?

int lc=findf(p[i].lp);

int rc=findf(p[i].rp)-1;

如上**所示,我們在查詢左端點時是正常查詢下標,而查詢右端點時我們把查詢出來的下標-1,這是為什麼呢?

void change(int rt,int l,int r)

else if(l==r)

else }

void ins(int rt,int l,int r,int v)

int mid=(ls+rs)>>1;

if(l<=mid)

if(r>mid)

change(rt,ls,rs);

}

如上,我們舉個例子:

(粘不上來)

簡而言之,就是如果我們有某種狀況:矩形覆蓋了區間[3,5],那麼如果用普通的線段樹,我們就會計算區間[3,4]和...[5]?

這樣顯然是不可以的

所以如上,我們在查詢更新的時候,我們把這個區間外的乙個點累計進這個區間裡,即我們令區間[3,4]累計的是區間[3,5)(左閉右開)的和,這樣就得到了優化。

還有乙個問題,就是如果我們這樣查詢,萬一有乙個區間叫[5,6],按這樣操作就變成了查詢[5,7),這樣顯然是錯誤的。

所以我們在查詢的時候,故意把右端點座標-1,如果想查詢區間[5,6],我們把他變成查詢區間[5],然後在查詢區間[5]的時候根據上述操作去查詢區間[5,6),這樣就能獲得最好的效果了。

貼**:

#include #include #include #include #include #include #include #include #define rt1 rt<<1

#define rt2 (rt<<1)|1

#define ls tree[rt].lson

#define rs tree[rt].rson

using namespace std;

struct tree

tree[800005];

int n,cnt;

struct node

p[200005];

double x[200005];

bool cmp(node a,node b)

int findf(double val)

else if(x[mid]>val)

else

}return -1;

}void change(int rt,int l,int r)

else if(l==r)

else }

void ins(int rt,int l,int r,int v)

int mid=(ls+rs)>>1;

if(l<=mid)

if(r>mid)

change(rt,ls,rs);

}int main()

int tot=0;

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

sort(x+1,x+tot+1,cmp1);

sort(p+1,p+tot+1,cmp);

cnt=0;

for(int i=2;i<=tot+1;i++)

}buildtree(1,1,cnt);

double ret=0;

for(int i=1;iret+=tree[1].sum*(p[i+1].hei-p[i].hei);

} printf("test case #%d\ntotal explored area: %.2lf\n\n",cas++,ret);

} return 0;

}

hdu1542(線段樹 掃瞄線)

裸的掃瞄線,學習掃瞄線的題目。具體掃瞄線的原理我不講了,我是看大神們的部落格懂得,就算寫也沒大神屌。下面我給出我的 裡面的注釋是我認為比較重要的地方 include include include includeusing namespace std const int max 210 int n ...

hdu 1542 掃瞄線 線段樹

題目大意 求矩形面積的並 思路 按y軸排序,然後將x投影到線段樹上做乙個線段覆蓋問題即可 注意 為了避免重複,線段座標右端點是開區間,更新時需要加上1 include include include include include define fo i,a,b for int i a i b i ...

hdu1542(線段樹 掃瞄線)

題目連線 又看到了幾個月前做的題,感覺那時候就是個sb 也怪自己剛開始沒搞清楚線段樹,瞎摸索 用連續線段樹很好理解這個題,之前的 稍微改了一下就好理解多了 1 include2 include3 include4 define lson l,m,rt 1 5 define rson m,r,rt 1...