//這篇部落格是不完整的,現在的知識儲備,貌似只能寫一些基礎的應用的
首先的話,來談下自己對線段樹的認識:
線段樹可以解決區間加法的問題,比如說,最大值,最小值,區間和的問題,
但是不可以解決不符合區間加法的問題,比如說眾數問題。
在網上看了很多版本的線段樹,看到了很多的結構體型別的線段樹。個人感覺結構體型別的線段樹
很好理解,自己覺得的話,線段樹主要運用了二分和分治的思想,求乙個區間的最大值,
分為兩個區間的最大值進行比較,區間和也是先求部分區間的和在求整體。
然後就是運用了二叉樹的優點,使得查詢時間為logn級別,
修改的話可以分為單點更新和區間更新。區間更新的話需要用到懶惰標記來降低複雜度。
網上其他部落格的**,感覺很好,但是自己敲一遍還是好的。
建樹**:
const
int maxn =
100005
;int a[maxn]
,t[maxn<<2]
;//a為原來區間,t為線段樹
void
pushup
(int k)
//遞迴方式建樹 build(1,1,n);
void
build
(int k,
int l,
int r)
}
單點更新**:
//遞迴方式更新 updata(p,v,1,n,1);
void
updata
(int p,
int v,
int l,
int r,
int k)
}
區間查詢**:
//遞迴方式區間查詢 query(l,r,1,n,1);
intquery
(int l,
int r,
int l,
int r,
int k)
}
參考部落格: 線段樹初級
今天做到一題是線段樹題,在此補充一下我自己缺失的知識點 首先介紹乙個寫的賊好的部落格 準備每天看一篇,每天增加乙個小的知識點。今天是線段樹 首先是建樹的過程,因為鄙人畫圖技術有限,所以大家還是參考那個部落格的講解吧,這裡主要是一些 void buildtree int l,int r,int n i...
線段樹 01 線段樹基礎
物理上 public class segmenttree public int getsize public e get int index 返回完全二叉樹的陣列表示中,乙個索引所表示的元素的左孩子節點的索引 private int leftchild int index 返回完全二叉樹的陣列表示中...
hdu 1556 初級線段樹
include include include define max 100005 define mid l r 1 define lson l,m,rt 1 define rson m 1,r,rt 1 1 using namespace std int n struct tree tree tr...