樹狀陣列的學習是看的這篇博文,從樹狀陣列的作用, 原理和實現來講解。仔細看看會有收穫,下面是我自己的對樹狀陣列的體會。
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打賭打...