線段樹模版

2022-02-02 16:26:09 字數 1550 閱讀 4971

題目:

給定乙個整數陣列  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個正整...