POJ 1151線段樹 離散化 掃瞄線

2022-03-12 14:18:44 字數 1515 閱讀 2228

poj1151

一開始做的時候,我還用以前做的離散化的方法來離散化這題中的資料,但是後來才發現,它裡面包含了浮點數。不能直接的離散化!必須轉化為整數後,再來影射.又學習了一種離散化的方法。還有就是掃瞄線的方法,第一次聽說,開始看這題的正確**的時候,看半天沒看懂。。。耽誤了好久時間。後來終於明白了什麼是掃瞄線的方法了。呵呵,又學習了!

具體的分析可以看下圖:

在y軸進行離散化。n個矩形的2n個橫邊縱座標共構成最多2n-1個區間的邊界,對這些區間編號,建立起線段樹。

//

以y軸來離散化資料

#include

#include

using

namespace std;

struct cline

}lines[210];

struct cnodetree[1000];

int mid(cnode* proot)

int nnodecount=0;

double y[210]; //

記錄y軸的邊

void create(cnode* proot,double l,double r)

template

f bin_search(f s,f e,t val)

return e;

}void insert(cnode* proot,int l,int r)

if(l>=mid(proot)+1)

else

if(r<=mid(proot))

else

if(proot->covers==0)

}void delete(cnode* proot,int l,int r)

if(l>=mid(proot)+1)

else

if(r<=mid(proot))

else

if(proot->covers==0)

}int main()

////把y軸離散化

sort(y,y+yc);

yc=unique(y,y+yc)-y;

sort(lines,lines+lc);

nnodecount=0; //

注意,不然會出現re。

create(tree,0,yc-1-1); //

yc是橫線的條數,yc-1是縱向區間數,從零開始編號

double area=0;

for(i=0;i1;i++)

printf("

test case #%d\n

",ncase);

printf("

total explored area: %.2lf\n

",area);

printf("

\n");

}return

0;}

POJ 1151 線段樹 掃瞄線

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

poj 1151矩形面積並 線段樹

title poj 1151矩形面積並 線段樹 date 2018 10 30 22 35 11 tags 線段樹問題裡的另乙個問題,矩形面積並,之前看lazy更新時看到下面這個的講解,一大堆文字還有一大堆的圖,當時果斷跳過,今天花了一下午加一晚上的時間看了看這塊知識,然後嘗試自己寫出 算是簡單的了...

POJ1151 離散化求矩形面積的並

第一道離散化的題目,雖然是水題,不過還是很高興。include include include using namespace std struct rect define max 103 1 rect a max 1 double x max y max bool flag max max int...