樹形陣列,一直久聞其名。經常有人拿他和線段樹做比較。就這道題來說,效率確實比線段樹高了不少。
對於乙個陣列來說,如果我們想多次求它的乙個區間的和的話,最好的方法是將a[i]中存入這個陣列的前i項和。當我們想要求區間[x,y]內所有資料的和的話,我們只需要用a[y]減去a[x-1]就行了。但是這個方法的問題是,如果我們修改了其中第k項的值的話,那麼我們就必須修改後面所有資料的值。
樹形陣列則是用了另一種原理,a[i]存得值得數量是lowbit[i],lowbit是**中的函式。這個方法優秀的地方是這個數值可以通過某種方式傳遞,類似於線段樹中子節點的在返回根節點的過程中順路修改一樣,在樹形陣列中這樣的修改效率是可以在logn的時間內完成的,在查詢區間的值上,樹形陣列也有著不俗的效率,而且非常節約空間。
非常尷尬的是我似乎解釋不了lowbit函式的原理。。。。
#include#include#define n 50005
int a[n],b[n];
int n;
int lowbit(int x)
int sum(int x)
return sum;
}int find(int x,int y)
void update(int x,int y)
return ;
}int main()
getchar();
int flag=1;
while(1)
printf("%d\n",find(x,y));
}} }
return 0;
}
hdu 1166 敵兵布陣
這是一道線段樹里最簡單的一類題目了,單點更新型別!include define lson l m rt 1 define rson m 1 r rt 1 1 const int maxx 55555 int sum maxx 2 void pushup int rt void build int l...
hdu 1166 敵兵布陣
線段樹的模版 沒什麼思想 include include include include include include include include include include include include include define ll long long define vi vec...
HDU 1166 敵兵布陣
description lily 特別喜歡養花,但是由於她的花特別多,所以照料這些花就變得不太容易。她把她的花依次排成一行,每盆花都有乙個美觀值。如果lily把某盆花照料的好的話,這盆花的美觀值就會上公升,如果照料的不好的話,這盆花的美觀值就會下降。有時,lily想知道某段連續的花的美觀值之和是多少...