線段樹學習總結

2021-08-04 22:38:50 字數 1547 閱讀 3103

隊伍分好後,我負責資料結構部分。。。。 以後要狂補資料結構了,不能再做水題找存在感了。

今天總結一下線段樹 以後長期更新題型。。

**線段樹是一種可以方便維護數列的資料結構。 更新和查詢都可以在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.答案...