線段樹總結

2021-06-23 02:33:52 字數 1673 閱讀 1173

線段樹總結:

線段樹的原理就是每乙個區間都可以被分成若干個不相交連續區間(重要)

線段樹維護的資料:

1.自身結構的資料(

比如 左兒子 

, 右兒子的編號)

2.懶惰標記 (

整段區間都變成乙個值

,或者將要進行什麼操作

.根據每次操作的型別

,把操作的區間分成若干個不連續的區間

,然後把操作的標記賦值給相應的區間)

3.答案 (

就是query

的答案,

比如區間的

sum什麼的

)

#define lc idx<<1   // 左兒子

#define rc idx<<1|1 //右兒子

#define mid ((l+r)>>1) //中點

using namespace std;

const int maxn=1e6+1; //最大區間

const int inf=1e9; //無限

class sgtree

}void maintain(int idx,int l,int r,這裡加上需要傳遞給這個節點的資料) //維護資料的函式

void pushdown(int idx,int l,int r)

void pushup(int idx,int l,int r)

void update(int idx,int l,int r,int x,int y,這個區間要改變的資料)

else

}void query(int idx,int l,int r,int x,int y)

else

}};sgtree tree;

#include #include #include #include #include #define lc idx<<1

#define rc idx<<1|1

#define mid ((l+r)>>1)

using namespace std;

const int maxn=1e6+1;

const int inf=1e9;

int _minn,_maxx,_sum;

class sgtree

}void maintain(int idx,int l,int r,int add_v,int set_v)

if(add_v)

}void pushdown(int idx,int l,int r)

void pushup(int idx)

void gset(int idx,int l,int r,int x,int y,int v) //區間設定

else

}void gadd(int idx,int l,int r,int x,int y,int v) //區間加

else

}void query(int idx,int l,int r,int x,int y) //詢問

else

}};sgtree tree[22]; //注意應該把這個開在外面,不讓可能因為陣列過大而暴stack

int main()

while(m--)

else if(p==2)

else}}

return 0;

}

線段樹總結

線段樹的入門級 總結 線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。對於線段樹中的每乙個非葉子節點 a,b 它的左兒子表示的區間為 a,a b 2 右兒子表示的區間為 a b 2 1,b 因此線段樹是平衡二叉樹,最後的子節點數目為n,即整...

線段樹總結

解決的題目 對區間所對應的一些資料進行修改,查詢。基本步驟 先建樹,然後插入資料,然後更新,查詢。關鍵部分 用線段樹解題,關鍵是要想清楚每個節點要存哪些資訊以及這些資訊如何高效更新,維護,查詢。不要一更新就更新到葉子節點,那樣更新效率最壞就可能變成o n 的了。建樹的方式 1 陣列 若根節點下標為0...

線段樹總結

線段樹能解決哪些問題 下面給出線段樹的幾個應用 1 有一列數,初始值全部為0。每次可以進行以下三種操作中的一種 a.給指定區間的每個數加上乙個特定值 b.將指定區間的所有數置成乙個統一的值 c.詢問乙個區間上的最小值 最大值 所有數的和。給出一系列a.b.操作後,輸出c的結果。問題分析 這個是典型的...