線段樹與樹狀陣列的綜合運用

2022-09-04 13:12:08 字數 2525 閱讀 3353

前言:線段樹樹狀陣列是高階資料結構最基本的部分,資料結構又是省選最基本的部分,所以從他開始整理一下。

題目以洛谷和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 如果第二次要求他交換,則他的不...