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 因此線段樹是平衡二叉樹,最後的子節點數目為...