關於線段樹與樹狀陣列的關鍵思想

2021-09-03 06:59:13 字數 1019 閱讀 1423

關於線段樹與樹狀陣列的關鍵思想

單點更新,區間求和

線段樹:

對單點,肯定要搜到葉子結點,然後回溯整條路徑加上val

對區間:只要搜到搜尋區間在詢問區間之內就累加即可

(每個累加的結點分別控制搜尋區間的一部分)

樹狀陣列:

對單點:從該位起不斷往上增,二進位制位包括該位的都累加

對區間:對第n位往下累加可得1~n位的和,求區間就詢問右界減詢問(左界-1)

(以第1位為標準,全部位都是相對他的差值,所左右界詢問值差分即可)

區間更新,單點求和

線段樹:

對區間:搜到搜尋區間在詢問區間之內就停止往下,結點加val表示區間所有位加val

對單點:從根開始搜到葉節子,路徑上所有結點的值全部累加即可

(以根為初始標準,每個結點都是相比其老豆的差值,一直差分到葉節點)

樹狀陣列:

對區間:從左界往上更新1,從(右界+1)往上更新-1,二進位制位包括該位的都累加

對單點:對第n位往下累加即得第n位的值,其實就是求字首和

(以最後的位n為基礎,每位i的值表示從i到n增加的值,也是與i-1位的差值)

(比如1,0,-1,0,求第二位的值掃0,1累加是1,因為第一位1表示1-n位全+1)

區間更新,區間求和

線段樹:

對更新:搜到搜尋區間在詢問區間之內就停止往下,結點val表示區間所有位都加val

然後開個lazy陣列表示還需要往下更新的值

對求和:只要搜到搜尋區間在詢問區間之內就累加即可,但每次搜尋時同時下推lazy

數狀陣列:(不建議)

對更新:開兩個樹狀陣列維護一次和與階梯和

對求和:設x是範圍,i是當前查詢的位置,查詢1~i位 的和

sum(sum(c[j],j<=i)i<=x)= x*c[1]+(x-1)*c[2]+……+c[x] =(x+1)*sum(c[i],i<=x)-sum(i*c[i],i<=x)

其中(x+1)是定值,所以要求1~i位的一次和s1與階梯和s2,然後(x+1)*s1-s2就是結果

樹狀陣列與線段樹

推一下關於樹狀陣列的講解部落格 和線段樹的講解 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 如果第二次要求他交換,則他的不...