這兩周是資料結構專題的學習,,被專題的題目虐得死去活來==
線段樹:簡單的說就是把【1,n】的區間二分,【1,(1+n)/2】左子樹,【(1+n)/2+1,n】右子樹
就這樣一直分下去,直到都是【x,x】這樣的區間。這樣就構成了一顆樹了^-^
有這樣一棵樹,我們就可以在節點中儲存區間的和啊,區間內的最大值啊,最小值等等。。這就是線段樹的附加資訊了,也是題目中的重點。。
我們可以用乙個陣列(長度為k)儲存原區間的初始值,然後根據這個建樹,所以這個樹的節點數最多為4*k;
對於每個節點i,其左子樹為i*2,右子樹為i*2+1,父母節點為i/2。該區間的sum為左右子樹區間和的和,最大最小值同理。。。
線段樹的建立,修改,查詢都是用遞迴寫的。
所以在對單個數值時,必定會影響到其祖先節點,所以從上往下寫。遞迴後修改節點資訊。
線段樹的查詢也是如此,從上向下查詢。
先貼模板
1 #include 2帶區間修改的版本:3using
namespace
std;45
#define mp make_pair
6#define pb push_back
7 typedef long
long
ll;8 typedef pairpii;
9const
double eps=1e-8;10
const
double pi=acos(-1.0
);11
const
int k=1e6+7;12
const
int mod=1e9+7;13
1415
struct
node16;
20struct node tree[4*k];
21int
a[k];
22void build(int id,int l,int
r)2333}
34int querymax(int id,int l,int
r)35
46int querysum(int id,int l,int
r)47
58void update(int id,int pos,int
v)5970}
71int main(void)72
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #includeview code1213
#define pi acos((double)-1)
14#define e exp(double(1))
15using
namespace
std;
16#define k 10000
17struct
node18;
22struct node tree[4*k];
23int
a[k];
24void build(int id,int l,int
r)25
31else
3238}39
void pushdowm(int
id)4049}
50int querymax(int id,int l,int
r)51
68return
ret;69}
70int update(int id,int pos,int
v)71
76else
7784
return0;
85}86void update_interal(int id,int l,int r,int
v)87
92pushdowm(id);
93int mid=(tree[id].left+tree[id].right)>>1;94
if(r<=mid)
95 update_interal(id*2
,l,r,v);
96else
if(l>mid)
97 update_interal(id*2+1
,l,r,v);
98else
99104
}105
int query(int id,int l,int
r)106
117}
118119
int main(void
)120
( 資料結構專題 ) 權值線段樹
資料結構專題 權值線段樹 學習權值線段樹,首先要了解線段樹是什麼。如果不會的可以先學習一下。權值線段樹,顧名思義是一棵線段樹。但它和普通線段樹不同 線段樹,每個節點用來維護一段區間的最大值或總和等。權值線段樹,相當於乙個桶,每個節點用來表示乙個區間的數出現的次數。我們可以用它來維護一段區間的數出現的...
樹鏈剖分 專題,學習記錄
理解了上面的那個部落格中的想法之後,你可以看這個神犇寫的 spoj上的 第一版 調了一下午 半晚上,第一次a的時候那真是excited include include include include include include using namespace std typedef long l...
資料結構 線段樹
啦啦啦啦啦啦線段樹是個好東西 好吧並沒有什麼好的 但貌似還是很好啊 線段樹就是一棵樹!顧名思義 又是這個詞 就是求關於一段的某些什麼什麼東西。比如區間最大值啊什麼的。引用百科知識 線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。對於線段樹中...