今天是很沉重的一天,進來ccf官宣取消oi,也不知道是不是真的。
oier們不要放棄夢想!大家一定要勇往直前!
這線段樹會很難…至少我是這麼想的…不過我也是經過百般實驗才敢寫這個部落格!
假定我給你乙個定區間,讓你以最快的速度做這樣的操作:修改其中的乙個子區間,查詢另乙個子區間的值,而且重複這些操作。你會說:for迴圈。沒錯,這複雜度是o(n)線段樹可以說是區間神器,它擁有四個處理區間的基本功能:單點查詢,單點修改,區間查詢,區間修改。除了建樹需要o(nlogn)的複雜度以外,其餘操作的複雜度是o(logn)。
先給乙個線段樹的圖吧。
這裡的數字是點標,不是點值。
詳細解析後續更新。
**裡提供微解析。
完整**如下:
#include
#include
#include
using namespace std;
#define maxm 10001
int n,a[maxm]
,sum[maxm]
,delta[maxm]
;void
update
(int x)
//這裡是統計左右兩個子節點的值並付給自己,每一次值更新都要update一次
//x<<1|1等價於x*2+1,位運算有什麼疑問可以去看下面的連線
////此函式用於標記下放
void
pushdown
(int now,
int l,
int r)
return;}
//遞迴建樹
void
build
(int now,
int l,
int r)
int mid=
(l+r)
>>1;
//遞迴處理左邊和右邊
build
(now<<
1,l,mid)
;build
(now<<1|
1,mid+
1,r)
;//處理完畢(分到最細)然後逐步統計上去
update
(now)
;return;}
//這個是單點修改
void
changepoint
(int now,
int l,
int r,
int x,
int v)
int mid=
(l+r)
>>1;
//記得下放懶惰標記
pushdown
(now,l,r)
;//在左邊(mid的左邊)就找左邊,反之找右邊
if(x<=mid)
else
//老規矩[手動滑稽],你改了你父親也要改,所以update
update
(now)
;return;}
//這是單點查詢
intaskpoint
(int now,
int l,
int r,
int x)
int mid=
(l+r)
>>1;
pushdown
(now,l,r)
;//簡直跟單點修改的過程一樣對吧
if(x<=mid)
else
//你看這裡查詢就不需要update
}int
askrange
(int now,
int l,
int r,
int tl,
int tr)
if(tr>mid)
return ans;
}void
changerange
(int now,
int l,
int r,
int tl,
int tr,
int v)
int mid=
(l+r)
>>1;
pushdown
(now,l,r)
;//處理左邊和右邊
if(tl<=mid)
if(tr>mid)
update
(now)
;return;}
intmain()
build(1
,1,n);
freopen
("con"
,"r"
,stdin);
int k,b,c;
char ju;
loop:cout<<
"你要做什麼"
<
cout<<
"1.區間修改"
<
"2.區間查詢"
<
"3.單點修改"
<
"4.單點查詢"
<
"5.退出"
<
cin>>ju;
if(ju==
'1')
else
if(ju==
'2')
else
if(ju==
'3')
else
if(ju==
'4')
else
if(ju==
'5')
goto loop;
fina:cout<<
"成功退出"
<
return0;
}
C 線段樹 高階資料結構
線段樹是一種平衡二叉搜尋樹 完全二叉樹 它將乙個線段區間劃分成一些單元區間。對於線段樹中的每乙個非葉子節點 a,b 他的左兒子表示的區間為 a,a b 2 右兒子表示的區間為 a b 2 1,b 最後的葉子節點數目為n,與陣列下標對應。線段樹的一般包括建立 查詢 插入 更新等操作,建立規模為n的時間...
資料結構 線段樹
啦啦啦啦啦啦線段樹是個好東西 好吧並沒有什麼好的 但貌似還是很好啊 線段樹就是一棵樹!顧名思義 又是這個詞 就是求關於一段的某些什麼什麼東西。比如區間最大值啊什麼的。引用百科知識 線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。對於線段樹中...
資料結構 線段樹
一 目標 1.如何快速的查詢出下列陣列arr 2,5 的和 2。以及更新arr 4 為6。用普通的方法查詢的複雜度為o n 更新的複雜度為o 1 這時候我們可以用線段樹來快速完成這些操作,複雜度為logn。二 內容 如何建立,查詢,更新線段樹。public class qurqpd int tree...