週中訓練筆記(四)

2021-08-08 14:28:56 字數 891 閱讀 6344

線段樹總結:

線段樹儲存的是區間的資訊然後在可以進行區間的各種操作。

對於節點a[n]它的左兒子為a[2*n]右兒子為a[2*n+1]。

假如這個節點所表示的區間為[1,5]那麼它左兒子表示的區間為[1,3],右兒子表示的區間為[4,5],公式為mid=(l+r)/2,左兒子表示的區間為(l,mid),右兒子表示的區間為(mid+1,r)。

線段樹的建立:void build(int id,int l,int r)

else}

我的理解:1.呼叫build(1,1,n)既可以將a[1]~a[n]的數就存到了二叉樹中,通過遞迴呼叫函式為線段樹進行便利。

2.當l==r時即進行tree[id].sum=a[l],tree[id].max=a[l]操作,當l==r時此時的區間只有乙個值所以直接令其等於a[l]即可。

3.當l!=r時呼叫tree[id].sum=tree[id*2].sum+tree[id*2+1].sum,tree[id].max=max(tree[id*2].max,tree[id*2+1].max既可以求出值,依次求最後最上面的即是所要的max和sum。

線段樹的更新:oid update(int id,int pos,int val)

else}

我的理解:通過遞迴函式層層深入,知道搜尋到更新的那點的位置時給那一點重新賦值,然後包含這乙個點的區間的值都得更新,if (pos<=mid)通過這乙個判斷就能保證數值更新的正確。

線段樹的最大值計算:void query(int id,int l,int r)}

我的理解:同樣通過遞迴函式從底層返回上來求和,else裡面的判斷就可以確定這個節點是兩個兒子的和還是其中乙個的值,然後最後返回到第一次呼叫函式的時候tree[1].left==l&&tree[1].right==r即輸出結果就行。

週中訓練筆記

rand 函式 rand n 範圍 0 n 1 n rand m n 1 範圍n m 線段樹的概括 1.是乙個完全二叉樹 2.主要用於解決解決連續區間的動態查詢問題 現在對於線段樹的認識還很侷限,所以概括的也非常籠統,接下來的幾天會繼續研究線段樹的。然後就是今天的廣西邀請賽重現賽的題 今天因為下午有...

週中訓練筆記11 線段樹總結

線段樹專題接近尾聲了,是時候總結一波了,說來慚愧,線段樹專題差不多都是參照題解才做出來的,雖然知道是套模板但是具體細節真的很拿人啊。主要總結一下線段樹的模板吧,題目的 實現都要以模板為框架構造 首先提出乙個問題 給你n個數,有兩種操作 1 給第i個數的值增加x 2 詢問區間 a,b 的總和是什麼?輸...

週中訓練筆記19 樹形DP總結

樹形dp暫時告一段落,今天總結了一下 首先,樹形dp 樹 dp,是一種二維的dp題目,也可以結合揹包問題,因為子樹的數量不確定,所以一般用vector來儲存子節點或子樹個數。平時作的動態規劃都是線性的或者是建立在圖上的,線性的動態規劃有二種方向既向前和向後,相應的線性的動態 規劃有二種方法既順推與逆...