隊伍分好後,我負責資料結構部分。。。。 以後要狂補資料結構了,不能再做水題找存在感了。
今天總結一下線段樹 以後長期更新題型。。
**線段樹是一種可以方便維護數列的資料結構。 更新和查詢都可以在log(n)的複雜度內完成。 經(我)證(不)明(會)其最差空間複雜度為4*n。記住就好。
線段樹可以看做維護線段的樹
首先,線段樹可以看做一顆完全二叉樹
完全二叉樹有什麼用呢? 我們發(百)現(度) 二叉樹符合二進位制思想,我們可以從一開始從上往下 從左至右編號 如下圖
這就很完美,我們可以在log(n)的時間內查詢到我們想要查詢的任意乙個點。
下面給出乙個看(比)得(較)懂(長)的模板。
線段樹的建立 build() 函式
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ****(x) cout
using namespace std;
const
int max=55555;
int n;
void pushup(int rt)
void build(int l,int r,int rt)
區間更新pushdown函式,用於區間更新 add陣列為懶惰標記陣列
//以下**為區間加減**
void pushdown(int rt)
}
涉及區間合併 求最長區間或符合條件的連續區間一般這麼寫
class
node
; // 我們將sum陣列由int型換成自定義類
//llen表示該節點所代表區間以左端開始最長合法區間
//rlen為該節點所代表的區間以右端結束的最長合法區間
//tlen為該區間裡最長合法區間。
node sum[max<<2];
int a[max];
void pushup(int l,int r,int rt)
void build(int l,int r,int rt)
void update(int p,bool flag,int l,int r,int rt)
int m=(l+r)>>1;
if(p>m) update(p,flag,rson);
else
if(p<=m) update(p,flag,lson);
pushup(l,r,rt);
}int ans=-1;
int query(int p,int l,int r,int rt)
else
}// 網上都有詳解
ZKW線段樹 學習總結
zkw線段樹 詳見 清華大學 張昆瑋 統計的力量 類似線段樹的二進位制實現,支援單點修改和區間查詢,運用位運算,非常簡單,作用類似樹狀陣列。模板解析見 可過洛谷 p3374 樹狀陣列模板 資料範圍 5e5 include using namespace std const int n 5e5 7 i...
線段樹與樹狀陣列學習總結 線段樹
點動成線 那麼就是說一條線段可以分成若干個點,再想想我們最常用的一維陣列,構成陣列的是乙個個的變數,如果把變數看成乙個個點,那麼陣列就是一條線了!而線段樹,就是一棵由線段構成的二叉樹,每個結點都代表一條線段 a,b 也就是我們前面說的一串變數 非葉子的結點所對應的線段都有兩個子結點,左兒子代表的線段...
線段樹總結
線段樹總結 線段樹的原理就是每乙個區間都可以被分成若干個不相交連續區間 重要 線段樹維護的資料 1.自身結構的資料 比如 左兒子 右兒子的編號 2.懶惰標記 整段區間都變成乙個值 或者將要進行什麼操作 根據每次操作的型別 把操作的區間分成若干個不連續的區間 然後把操作的標記賦值給相應的區間 3.答案...