對於一棵最大線段樹, 每個節點包含乙個額外的max
屬性,用於儲存該節點所代表區間的最大值。
設計乙個modify
的方法,接受三個引數root
、index
和value
。該方法將 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...