線段樹總結:
線段樹的原理就是每乙個區間都可以被分成若干個不相交連續區間(重要)
線段樹維護的資料:
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的結果。問題分析 這個是典型的...