線段樹學習 初級基礎操作

2021-09-28 16:59:09 字數 1048 閱讀 9652

//這篇部落格是不完整的,現在的知識儲備,貌似只能寫一些基礎的應用的

首先的話,來談下自己對線段樹的認識:

線段樹可以解決區間加法的問題,比如說,最大值,最小值,區間和的問題,

但是不可以解決不符合區間加法的問題,比如說眾數問題。

在網上看了很多版本的線段樹,看到了很多的結構體型別的線段樹。個人感覺結構體型別的線段樹

很好理解,自己覺得的話,線段樹主要運用了二分和分治的思想,求乙個區間的最大值,

分為兩個區間的最大值進行比較,區間和也是先求部分區間的和在求整體。

然後就是運用了二叉樹的優點,使得查詢時間為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...