線段樹入門 資料整理

2022-03-16 20:46:33 字數 2272 閱讀 5504

c題題解,專題訓練一

講解線段樹從入門到高階

線段樹開闢的空間一般是需要儲存的資料的4倍。

線段樹使用了二分的思想(我自己認為),把區域進行不斷的二分。

她能把一些對於區間(或者線段)的修改、維護,從$$o(n)$$的時間複雜度變成$$o(logn)$$。

目前常見的模板中,大體有兩種形式:

使用簡單陣列,在函式引數表表示邊界,這樣比較節省空間,但是函式引數變得比較多

使用結構體陣列,左右邊界儲存在了結構體中,這樣使得函式的引數比較少,但是占用的儲存空間比較多,但是目前來看,這個好像比較常用。

基本的 區間和 和 最值問題

# define ls (rt<<1)

# define rs (rt<<1|1)

typedef long long ll;

const int maxn=1e5+7;

struct nodet[maxn<<2];

ll num[maxn]; //記錄原始的資料

int n, m;

inline void up(int rt)

void build(int rt, int l, int r)

int mid=(l+r)>>1;

build(ls, l, mid);

build(rs, mid+1, r);

up(rt);

}void down(int rt)

}void nodeupdate(int rt, int id, int v)

down(rt); //在進入更小的範圍前,需要先呼叫down函式來把lzay傳下去

int mid=(t[rt].l+t[rt].r)>>1;

if(x<=mid) update(ls, x, v);

else update(rs, x, v);

up(rt); //點更新後,需要再次進行更新

}void up_date(int rt, int l, int r, int x)

pushdown(rt);

int mid = (l+r)>>1;

if(l<=mid) up_date(rt<<1, l, r, x);

if(mid>1;

if(l<=mid) ans+=query(ls, l, r);

if(r>mid) ans+=query(rs, l, r);

return ans;

}int main()

除了,可以進行和 和 最值的求取外,還可以處理區間連續性問題。如下:

//hdu1540的實現**,題意:求滿足要求連續的區間長度

#include #include #include #include #include using namespace std;

const int maxn = 50000+10;

int n,m;

int s[maxn],top;//s為模擬棧

struct node

a[maxn<<2];

void init(int l,int r,int i)

void insert(int i,int t,int x)

int mid = (a[i].l+a[i].r)>>1;

if(t<=mid)

insert(2*i,t,x);

else

insert(2*i+1,t,x);

a[i].ls = a[2*i].ls;//左區間

a[i].rs = a[2*i+1].rs;//右區間

a[i].ms = max(max(a[2*i].ms,a[2*i+1].ms),a[2*i].rs+a[2*i+1].ls);//父親區間內的最大區間必定是,左子樹最大區間,右子樹最大區間,左右子樹合併的中間區間,三者中最大的區間值

if(a[2*i].ls == a[2*i].r-a[2*i].l+1)//左子樹區間滿了的話,父親左區間要加上右孩子的左區間

a[i].ls += a[2*i+1].ls;

if(a[2*i+1].rs == a[2*i+1].r-a[2*i+1].l+1)//同理

a[i].rs += a[2*i].rs;}

int query(int i,int t)

else

} int main()

else if(ch[0] == 'q')

else}}

}return 0;

}

線段樹入門整理

線段樹 interval tree 是把區間逐次二分得到的一樹狀結構,它反映了包括歸併排序在內的很多分治演算法的問題求解方式。宣告 1 include2 include3 const int maxnode 2097152 4 const int max 1000003 5 struct noden...

線段樹入門

線段樹 interval tree 是把區間逐次二分得到的一樹狀結構,它反映了包括歸併排序在內的很多分治演算法的問題求解方式。上圖是一棵典型的線段樹,它對區間 1,10 進行分割,直到單個點。這棵樹的特點 是 1.每一層都是區間 a,b 的乙個劃分,記 l b a 2.一共有log2l層 3.給定乙...

線段樹入門

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