當你遇到了這樣的題目時:
現在請求你維護乙個數列,要求提供以下兩種操作:
1、 查詢操作。
語法:q l
功能:查詢當前數列中末尾l個數中的最大的數,並輸出這個數的值。
限制:l不超過當前數列的長度。(l>=0)
2、 插入操作。
語法:a n
功能:將n加上t,其中t是最近一次查詢操作的答案(如果還未執行過查詢操作,則t=0),並將所得結果對乙個固定的常數d取模,將所得答案插入到數列的末尾。
限制:n是整數(可能為負數)並且在長整範圍內。
注意:初始時數列是空的,沒有乙個數。
你的第一反應是什麼? 當然是暴力模擬了。
然後我們來分析一下資料:操作個數<=20,0000,暴力做的話,時間複雜度o(m^2),絕對tle,可能連40都達不到。
於是線段樹橫空出世了。
線段樹是一種二叉查詢樹,充分利用了二叉樹「快」的特點,可以高效率完成區間修改、區間查詢、區間最值等操作。
大體思路是:將乙個區間劃分為一些單元區間,每個單元區間對應線段樹中的乙個葉節點。其有以下幾種操作:
① 區間修改(change(x,tree)):將ai~aj全部加x。
② 刪除元素(delete(x,tree)):從線段樹tree中刪除元素x。
速度都為o(logn)
當然還有一些更加實用的操作,但稍微有些複雜,會舉例詳細講解。
線段樹的構造:線段樹大多都是用結構體遞迴來構造的,**如下:
#include using namespace std;
struct node;
void build(node *cur, int l, int r);
int main()
void build(node *cur, int l, int r)
else
}
這樣,乙個線段樹便建成了。
參考一些《演算法競賽》的內容。
線段樹建樹
線段樹是一種二叉樹,也就是說,每個線段都可以用一二叉樹表示 比如乙個長度為4的線段可以如此表示 4 1 2 3 4 1 2 3 4 如果你要表示線段上的和,最上面的根表示線段1 4的和 下面兩個子節點表示1 2,3 4的和,以此類推 卐 然後我們還可以得到乙個性質 節點i的權值 她的左兒子權值 她的...
線段樹初步 可持久化線段樹
人的知識就好比乙個圓圈,圓圈裡面是已知的,圓圈外面是未知的。你知道得越多,圓圈也就越大,你不知道的也就越多。芝諾 線段樹以其特點能被用來解決許多的問題,其拓展性極強。故學好 用好線段樹對增加你的 長度有顯著作用。這篇簡小的文章,就來講一講線段樹的一種變式 可持久化線段樹 又作主席樹 函式式線段樹等 ...
線段樹初步理解
原本這兩天在搞網路流的.但最近幾次網賽多次遇到了線段樹的題目.意識到線段樹還是重要的.所以今天就初步的了解了線段樹最簡單的應用.單點更新.今天學習線段樹主要是看notonlysuccess大牛的模板 風格非常好.很適合初學線段樹的來參考.網上的一些ppt也不錯.一步一步動態描述線段樹的演算法過程.線...