研究了線段樹計算矩形面積的水題poj1151的實現過程,我又好好研究了用線段樹來解決另一道稍微難一點的題:hdu3265,這是09年寧波賽區的一道題,只是在poj1151的基礎上更巧妙了一點!
由於題目給出的矩形是回字形,所以我把把乙個回字拆開就可以了,也就是說,hdu3265中插入乙個poster,相當於插入了四個矩形(也可能只有三個)!
由於題目的資料量比較小,只有5000,而且是整型,所以不用離散化操作!在面前那道題的基礎上,去掉離散化就ok了!
把**貼出來吧!
#include#include
using
namespace std;
#define m 50001
typedef
long
long llong;
struct treetree[4*m];
struct lineline[8*m];
//比較函式
bool cmp(const line &l1,const line &l2)
return l1.x}
//建樹
void build(int id,int ll,int rr)
void lenght(int id)else
if(tree[id].ll+1==tree[id].rr)else
tree[id].len=tree[id*2].len+tree[id*2+1].len;
} //更新樹
void update(int id,line line)else
if(line.y1>=tree[2*id+1].ll)else
if(line.y2<=tree[id*2].rr)else
lenght(id);//回溯的時候 修改,使根結點的len實時更新
} void load(int id,int x,int y1,int y2,int flag)
int main()
if(x3load(t,x3,y4,y2,1);t++;
load(t,x4,y4,y2,-1);t++;
max=max(max,max(y4,y2));
} if(x3load(t,x3,y1,y3,1);t++;
load(t,x4,y1,y3,-1);t++;
max=max(max,max(y1,y3));
} if(x4load(t,x4,y1,y2,1);t++;
load(t,x2,y1,y2,-1);t++;
max=max(max,max(y1,y2));
} }
sort(line+1,line+t,cmp);
build(1,1,max);//用y的最大值來建樹
update ( 1, line[1]);//第一條邊一定是入邊
llong ans=0;
for(i=2;ians+=(llong)tree[1].len*(llong)(line[i].x-line[i-1].x);
update(1,line[i]);//最後一條邊肯定是出邊,不用考慮
} printf("%i64d\n",ans);
} return 0; }
經過這幾天的思考,我對線段樹的認識也更深入了一些!我們用線段樹解決矩形相關的問題時,容易走進乙個誤區,那就是矩形是二維的,而通常我們學習的線段樹是一維的!用一維的線段樹來操作二維的區間,是很難讓人想通其中的細節!
但實際上,線段樹操作的依然是一維的!這就需要我們把線段樹操作線段(比如線段著色)的細節弄清楚!從我部落格中關於線段樹的兩道題可以看出,線段樹管理的只是x軸或者y軸的線段,
怎麼管理呢?線段的插入或者刪除!所以我理解到的用線段樹線段樹求矩形面積的本質就是:用線段樹來插入或者刪除線段,再本質一點:線段樹的更新區間操作!
再回到矩形的面積,用線段樹其實用到了一種分割的思想,把原來的三個矩形分割成了5個矩形,x軸排序後,矩形的高是很容易求出來的,我們可以不管,但是矩形的寬度就不好求,這時候,線段樹的作用就凸顯出來了!所以線段樹在這裡,本質上還是管理線段,而不是矩形!
線段樹的學習之 如何用線段樹計算矩形面積
線段樹是一種靈活的具有區間管理功能的資料結構,其用途跨越離散和線性思想!我們最常用到的線段樹就是區間求和 intervertree.cpp created on 2012 11 1 author administrator include define m 100 define mid a,b a ...
線段樹學習
今天學習了線段樹。是敲了不少 可是感覺還沒有真正理解 先不貼題目。再消化消化。一會兒還有計組實驗。還有那個傲嬌的老師。真是煩。餓。先去吃飯去。一天木有吃。以下 線段樹模板 線段樹的節點 節點包括兩部分資訊,基本域,和資訊域 基本域 左右邊界ld,rd.左右孩子 lc,rc 資訊域 key值,如rmq...
學習線段樹
參考文章 從簡單說起,線段樹其實可以理解成一種特殊的二叉樹。但是這種二叉樹較為平衡,和靜態二叉樹一樣,都是提前已經建立好的樹形結構。針對性強,所以效率要高。這裡又想到了一句題外話 動態和靜態的差別。動態結構較為靈活,但是速度較慢 靜態結構沒有節省記憶體,但速度較快。演算法導論中有涉及區間樹的內容,那...