區間資訊的維護和查詢系列演算法 樹狀陣列

2021-07-03 21:28:22 字數 1188 閱讀 3641

樹狀陣列的學習是看的這篇博文,從樹狀陣列的作用, 原理和實現來講解。仔細看看會有收穫,下面是我自己的對樹狀陣列的體會。

1.樹狀陣列的應用。

當我們求解乙個動態連續和查詢問題的時候,樹狀陣列就派上了用場, 它是一種資料結構,進行連續和查詢時的時間複雜度為o(logn)。

從上圖中我們可以發現乙個規律,由a陣列和c陣列組成,

c[1]=a[1];

c[2]=a[1]+a[2];

c[3]=a[3];

c[4]=a[1]+a[2]+a[3]+a[4];

c[5]=a[5];

c[6]=a[5]+a[6];

c[7]=a[7];

c[8]=a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8];

相信大家也都看出規律來了,要根據i的奇偶分兩種情況。

當i為奇數時,c[i]=a[i];

當i為偶數時,要看i的因子中最多有2的多少次冪,例如4=2^2,6的因子為2=2^1,8=2^3;所有4,6,8分別由4,2,8個a陣列元素組成。且都是由i向前數相應的數。例如c[6]=a[5]+a[6];

(一)公式

ci=a(i-a^k+1)+………+an(其中 k 為 n 的二進位制表示中從右往左數的 0 的個數,數到1就停止,當為奇數的時候低位總是1,所以k=0)。偶數可以自己動手算一下。

於是就有了樹狀陣列的乙個重要的因素。

int lowbit(int x)

在這裡解釋下該演算法的含義,(來自白書)我們知道在計算機中,整數都是以其補碼的形式表示的,因此-x實際上是x按位取反再加1的效果,

38288=1001010110010000

-38288=0110101001110000

與運算之後,前面的全變成0,之後的lowbit位不變,返回2^k;

求和 注意n-lowbit(n)的含義

int sum(int n)

return

sum;

}

動態修改

void change(int i,int x)

}

Splay 區間資訊的維護與查詢 靜態模板

splay樹除了被用作平衡二叉樹之外,還有許多更高階但我們不常用的功能,比如 用splay的旋轉操作來維護區間資訊,這裡的旋轉優先順序我們可以用乙個rank來表示,則rank i 就代表了第i個點的優先順序 對應的就是原來的序列中的位置標號 通過依據對位置標號的旋轉操作,我們可以更加方便直觀的維護乙...

J 外掛程式 線段樹維護平方的區間和

時間限制 c c 1秒,其他語言2秒 空間限制 c c 65536k,其他語言131072k 64bit io format lld 我的就是我的,你也是我的,記住了,狐狸!韓信 白龍吟 對於打賭輸了的小t會遭受到制裁,小s修改了資料庫使他可以派出許多軍隊來圍攻小t.很不幸,小t與小s打賭打輸了,現...

線段樹 (維護 區間平方和 Lazy標記)

外掛程式時間限制 c c 1秒,其他語言2秒 空間限制 c c 65536k,其他語言131072k 64bit io format lld 我的就是我的,你也是我的,記住了,狐狸!韓信 白龍吟 對於打賭輸了的小t會遭受到制裁,小s修改了資料庫使他可以派出許多軍隊來圍攻小t.很不幸,小t與小s打賭打...