線段樹的修改

2021-08-18 14:25:46 字數 1651 閱讀 5626

對於一棵最大線段樹, 每個節點包含乙個額外的max屬性,用於儲存該節點所代表區間的最大值。

設計乙個modify的方法,接受三個引數rootindexvalue。該方法將 root 為根的線段樹中 [start, end] = [index, index] 的節點修改為了新的 value ,並確保在修改後,線段樹的每個節點的 max 屬性仍然具有正確的值。

對於這個修改思路其實很簡單,利用遞迴,找到start等於end並且和index相等的,修改max的值為value,此時遞迴再次呼叫,因為修改了max的值可能導致root節點的max變化,所以start不等於end時就要獲取left和right的最大值,取最大值,依次遞迴下去。對於線段樹的構造和查詢也是如此,都是利用遞迴。

public class solution 

segmenttreenode root = new segmenttreenode(start,end);

if(start != end)

return root;

}/** * 線段樹查詢

* @param root: the root of segment tree.

* @param start: start value.

* @param end: end value.

* @return: the maximum number in the interval [start, end]

*/public int query(segmenttreenode root, int start, int end)

if(root.start>end || root.endend)

if(start<=root.start && end>=root.end)

int rootmid = (root.start+root.end)/2;

int leftmax = query(root.left,start,math.min(rootmid,end));

int rightmax = query(root.right,math.max(rootmid,start),end);

return math.max(leftmax,rightmax);

}/** * 線段樹修改

* @param root: the root of segment tree.

* @param index: index.

* @param value: value

* @return: nothing

*/public void modify(segmenttreenode root, int index, int value)

if(root.start>index || root.end< index)

if(root.start == root.end && root.start == index)

if(root.left.end>=index)else if(root.right.start<=index)

root.max = math.max(root.left.max,root.right.max);

} }

線段樹的修改

對於一棵 最大線段樹,每個節點包含乙個額外的max屬性,用於儲存該節點所代表區間的最大值。設計乙個modify的方法,接受三個引數root index和value。該方法將 root 為跟的線段樹中 start,end index,index 的節點修改為了新的 value 並確保在修改後,線段樹的...

線段樹的修改

單點修改就很簡單啦,直接遞迴到葉子節點修改就行 void modify int k,int l,int r,int x,int v int mid l r 1 if x mid modify ls k l,mid,x,v else modify rs k mid 1,r x v tree k tre...

線段樹的區間修改

1 include 2 include3 define lc p 1 該節點的左孩子 4 define rc p 1 1 右孩子5 using namespace std 67 很類似與樹狀陣列 8int n,m 9struct segment tree 10tree 1000000 線段樹陣列 1...