線段樹的學習之 如何用線段樹計算矩形面積(二)

2021-09-03 10:44:52 字數 2032 閱讀 1049

研究了線段樹計算矩形面積的水題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...

學習線段樹

參考文章 從簡單說起,線段樹其實可以理解成一種特殊的二叉樹。但是這種二叉樹較為平衡,和靜態二叉樹一樣,都是提前已經建立好的樹形結構。針對性強,所以效率要高。這裡又想到了一句題外話 動態和靜態的差別。動態結構較為靈活,但是速度較慢 靜態結構沒有節省記憶體,但速度較快。演算法導論中有涉及區間樹的內容,那...