簡單線段樹模板

2021-07-25 23:25:16 字數 1388 閱讀 1514

入門第四天,前三天的沒時間補,回去再慢慢寫吧。

今天學長講的是線段樹,講得很有老師的感覺...然後就是講的也都差不多聽懂了,只是有些細節在寫**的時候沒有注意到,一直錯。

需要注意的點:

1.在build的時候在left==right時是node[u] = a[left],之前老是錯寫成node[left] = a[left]。

2.在query中不是非常明白在需要查詢的begin和end跨區間時是怎樣一種原理。

3.原來的**版本是用結構體寫的,有涉及到乙個pushup()函式,改用陣列之後就無需這個函式(可以省略,也可以強行分出來)。

4.陣列版本的線段樹的遞迴子函式的左右上限是需要用mid去替換的,之前一直沒替換,導致死迴圈。

應該就沒什麼需要注意的了,第一次寫總結也不知道該寫什麼,感覺昨天的數論和明天將要學的貪心演算法比較難懂,今天學的線段樹和單點更新在學長的耐心講解下還是比較容易理解的。

隊伍從一開始的一百七十多人,到留校訓練的90人,一天比一天少,今天是第四天,下午來訓練的有22人,晚上做oj的有12人。教練還總刺激我...問了問別的隊員,說關係很和睦...可能只是單純的看我不順眼吧,做好自己的就好。

#include #define ls (u<<1)

#define rs (u<<1|1)

using namespace std;

const int maxn=200005;

int node[maxn<<2],a[maxn];void build(int u, int left, int right)

}void update(int u, int left, int right, int ai, int num)

int mid = (left + right) >> 1;

if(ai<=mid) update(ls, left, mid, ai,num);

else update(rs, mid+1, right, ai, num);

node[u] = node[ls] + node[rs];

}int query(int u, int left, int right, int begin, int end)

int main ()

{#ifndef online_judge

freopen("in.txt","r",stdin);

#endif // online_judge

int t,n,i,j;

char s[15];

scanf("%d",&t);

for(int t=1 ; t<=t ; t++){

scanf("%d",&n);

printf("case %d:\n",t);

for(i=0 ; i

簡單線段樹(模板)

hdu 1754 模板,單點更新,區間查詢 1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 include 9 include 10 include 11 include 12 define lson l...

hdu 1556 簡單線段樹

漢語題,不解釋 思路 此題是線段樹的染色,先分段染色,可以nlogn級別,在算出每個位置的染色數 求染色數的時候,有兩種方法 1,用乙個數記錄step的值,之後除以2,把每個值相加,直到為一時結束 為從下向上尋找 2,用遞迴,從上往下尋找 下面是我的2 include include include...

HDU 1754 簡單線段樹

題意如下 給你從1到n 每個學生的成績。有m個操作,操作分為兩種,一種是查詢q x y 查詢從x學生到y學生的最高分數 另一種就是u x y 將學生x的成績改為y 一道明顯的線段樹題目 過程也是比較明確,建樹 查詢最大值 更新樹.附上 include include include define m...