線段樹入門練習(單點更新,區間修改)長期更新

2021-10-04 13:40:18 字數 1279 閱讀 3148

key:單點更新並詢問區間最大值

#include

#define maxn 200010

using

namespace std;

const

int maxnode =

1<<19;

struct nodenode[maxnode]

;int f[maxn]

;//儲存每單個節點的對應下標

void

buildtree

(int i,

int left,

int right)

/*將區間一分為二*/

buildtree

(i<<

1,left,

(left+right)

/2.0);

//往左孩子方向繼續建立線段樹

buildtree

((i<<1)

+1,(left+right)

/2.0+1

,right)

;//往右

}void

updatetree

(int ri)

int max;

void

query

(int i,

int l,

int r)

i = i<<1;

//向下找

if(l <= node[i]

.right)

//左區間有涉及

if(r <= node[i]

.right)

query

(i,l,r)

;//全包含在左區間內,形態不變

else

query

(i,l,node[i]

.right)

;//半包於左區間,則需將區間拆分,左端點不變,右端點變成左孩子的右區間端點

i++;if

(r >= node[i]

.left)

//與上相反

if(l >= node[i]

.left)

query

(i,l,r)

;else query (i,node[i]

.left,r);}

intmain()

int a,b;

while

(m--

)else}}

return0;

}

tips:位運算 i<<1為二進位制下i左移一位,i>>1反之。

單點更新,區間查詢線段樹

線段樹的空間複雜度是4n include include include using namespace std const int maxn 100005 const int inf 0x3f3f3f3f int n,a maxn struct node 結點 tree maxn 4 樹結點儲存陣...

線段樹 學習 模板 單點更新 區間更新

線段樹是幹什麼的?有一列數,每次可以進行以下三種操作中的一種 1 給指定區間中的每個數都加上某個值 2 將指定區間內的所有數置成某乙個統一的值 3 詢問乙個區間上的最小值 最大值 所有數的和。樸素做法怎麼做?用線性表儲存,每種操作,對待處理或待詢問區間中的每個元素都逐一進行處理。複雜度多少?假設這個...

I Hate It 線段樹單點更新區間查詢

很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。這讓很多學生很反感。不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫乙個程式,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。input 本題目包含多組測試,請處理到檔案結束。在每個測試的第一行,有兩個...