題目:
給定乙個整數陣列 nums,求出陣列從索引 i 到 j (i ≤ j) 範圍內元素的總和,包含 i, j 兩點。
update(i, val) 函式可以通過將下標為 i 的數值更新為 val,從而對數列進行修改。
示例:
given nums = [1, 3, 5]說明:sumrange(0, 2) -> 9update(1, 2)
sumrange(0, 2) -> 8
1.陣列僅可以在 update 函式下進行修改。思路:2.你可以假設 update 函式與 sumrange 函式的呼叫次數是均勻分布的。
線段樹可以分為以下三個步驟:
從給定陣列構建線段樹的預處理步驟。
修改元素時更新線段樹。
使用線段樹進行區域和檢索。
經典題型:線段樹
public
class
p307rangesumquerymutable );
system.out.println(obj.sumrange(0, 3));
obj.update(1, 2);
system.out.println(obj.sumrange(0, 3));
}static
class
numarray
//從後向前計算arr[i] = arr[2*i] + arr[2*i + 1],左節點為偶數節點,右節點為奇數節點
for (int i = len - 1; i > 0; i--) }}
//每次更新都要從下向上更新父節點直至根節點
public
void update(int i, int
val)
else
//向上為父節點
position /= 2;}}
//區域和檢索:
每次確保左邊界為偶數,右邊界為奇數然後同時除以2
//如果左邊界不為偶數,則當前和加上當前左邊界值,左邊界向右移動一位,然後除以2
//如果右邊界不為奇數,則當前和加上當前右邊界值,右邊界向左移動一位,然後除以2
//直到左邊界大於右邊界截止
public
int sumrange(int i, int
j)
//右邊界為偶數
if ((j % 2) == 0)
i /= 2;
j /= 2;
}return
sum;}}
}
線段樹模版
如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 輸入格式 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包...
線段樹 區間更新 模版
include include cstdio include string.h using namespace std const int n 100005 struct node tree n 4 int n,m int a n void init 將下面更新的值返回上一層 void pushup...
線段樹模版 codevs1081線段樹練習2
題目描述 description 給你n個數,有兩種操作 1 給區間 a,b 的所有數都增加x 2 詢問第i個數是什麼?輸入描述 input description 第一行乙個正整數n,接下來n行n個整數,再接下來乙個正整數q,表示操作的個數.接下來q行每行若干個整數。如果第乙個數是1,後接3個正整...