前言:線段樹樹狀陣列是高階資料結構最基本的部分,資料結構又是省選最基本的部分,所以從他開始整理一下。
題目以洛谷和bz為基底
1.基礎運用
資料結構最基本的問題就是操作和詢問的問題,
修改可以分為點修改(包括點的函式運算)
區間運算
區間最大最小和取模
區間set
其中點修改就是領出樹上的一條長鏈,對其末端進行花式操作
區間修改就有點意思了
寫過線段樹再過來看寒文的人大概都爛熟lazy tag 這個東西剛學的時候確實還是乙個障礙。
劉汝佳的藍書上提到了區間set 這其實並不難只是難寫吧(區間
maxmin
和區間set
一樣 下傳標記加個
if就可以)
區間取模我還是在乙個pdf裡學的 其精髓是儲存節點附加資訊的時候多三個——
max,
sumofmax
和secondmax
(看名字能理解吧)然後
我們來試著打一打補丁。
下面為引用
• 對線段樹上的每乙個區間維護區間最大值mx
,這個區間中最大值出 現的次數
t,區間次大值
se,當然還要維護區間和
sum
• 現在考慮打上區間取
min標記x:
• 如果mx<=x
,那麼對
sum就沒有修改。
• 如果se,那麼
sum=sum-(mx-x)×t
。 • 如果x<=se,那麼…
• 如果遇到這種情況,我們分別dfs
這個節點的兩個孩子,如果當前
dfs的過程中遇到了前兩種情況,就直接修改打上標記然後退出,否 則就繼續
dfs。
查詢則有點查詢(因為毫無意義實在不常見)區間和查詢
區間查詢運算答案
區間最大最小值
歷史最大最小值
由於點修改點查詢是陣列的運用。。。。於是就從區間查詢開始
·區間和查詢
這是最基本的一種線段樹(樹狀陣列運用)建議乙個月寫一下保持手感
洛谷p3374就很好不過線段樹只能打70,無視就好
另外p3372線段樹模板
1p2023 [ahoi2009]維護序列都不錯
·區間運算。這個其實還分很多種,不過都是在節點資訊上做手腳(注意lazytag
運用結合律的姿勢)
·區間最大最小值
rmqrmqrmqmrmq問題。。。。。。請線段樹只是處理動態問題的
rmq,極為好寫因為這其實是點查詢。。。。。。
·歷史查詢最大值。
我們把修改對映到樹上。
比如12345的樹我們觀察到查詢的節點(記錄下來)發生了
+a,+b,=0,=c,-d,+e
……的操作,求得就是這個東西的區間最大。
如果有乘除模和函式運算,就不大好弄了(有待更新)
這其實是乙個小應用,它包含的是下面的思想但是我們觀察到樹高度達不到1000,
所以m(query times)log^2 n的動規解決也可以
,這個複雜度雖然容易被卡但是
n1000000,m1000000
的資料還是很大概率可以的,動規加點卡常也許就很穩了。
·動態數列區間最大子段和
藍書上的例題9la3938援引洛杉磯大學題庫裡的。
線段樹,建樹過程中要標記
max_all:最大連續和
max_prefix:最大字首和
max_suffix:最大字尾和
pre_r:最大字首的結束位置
suf_l:最大字尾的開始位置
sum:區間總和
對於更新,由於要x盡量小與
y盡量小,所以在更新的時候我們要確定好更新的順序,也就是
l先盡量小,然後才是
y盡量小
更新有5種狀況,那麼按順序就是
1.左邊的
sum+
右區間的
max_prefix;
2.左區間
max_all
3.左邊的
max_suffix+
右邊的max_prefix
4.左邊的
max_suffix+
右邊的sum
5.右邊的
max_all
可以說是很有首創難度思維難度。
題目:有待更新
2.改變存點方式。
印象最深的改變點的資訊就是主席樹了。。。。
這個東西其實是一類大型題目(考爛了)
分塊莫隊都可以解決
這類題目都可以用桶子陣列字首和的方式解決
什麼意思呢,就是離散化儲存set,加入就改它的對應位置
+1,這個時候解決的就是區間個數差問題(字首和思想)
3.有待發現
學習無止境~~~~~~~~~
樹狀陣列與線段樹
推一下關於樹狀陣列的講解部落格 和線段樹的講解 package test2 public class 線段樹 int len a.length segtree t buildtree 0,len 1,a int sum0 2 query t,0,2 int sum1 3 query t,1,3 查詢...
樹狀陣列與線段樹(三)
找規律題 1.螺旋折線 如下圖所示的螺旋折線經過平面上所有整點恰好一次。對於整點 x,y 我們定義它到原點的距離 dis x,y 是從原點到 x,y 的螺旋折線段的長度。例如 dis 0,1 3,dis 2,1 9 給出整點座標 x,y 你能計算出 dis x,y 嗎?輸入格式 包含兩個整數 x,y...
樹狀陣列與線段樹(二)
樹狀陣列 1.小朋友排隊 n n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是 0 0 如果某個小朋友第一次被要求交換,則他的不高興程度增加 1 1 如果第二次要求他交換,則他的不...