最近學習了一下樹狀陣列,這道題糾結了很久,終究是因為沒有明白樹狀陣列怎麼用。
感覺網上許多大神都只是講原理,對於我們這些初學的菜鳥恐怕都被嚇跑了。
這裡我就以實用主義說一下使用方法(其實我覺得其原理應該能對我們更有啟發,也許會帶來很多潛在的好處):
這裡需要注意的是,bit的實現**中的bit陣列一開始必須清零,這個陣列並不是用來儲存元素的,而是為實現這個資料結構而存在的。 你需要儲存的元素是要通過那個add函式新增的,而求和則是要通過sum函式實現的,而這個bit陣列的結構並不是對於乙個新手很容易理解的,我們也大可不必關心這個。
另外要注意乙個地方,在add函式裡那個n,要開的足夠大,不然你是新增不進去的,比如你要是把n=10,求sum(100) 會得到0 。
舉個例子: 輸入n個元素,求前n個元素的和。**如下
#include#include#includeusing namespace std;
int bit[1000],n;
int sum(int i)
return s;
}int add(int i,int x)
}int main()
for(int i=1;i<=n;i++) printf("%d\n",sum(i));
}return 0;
}
相信看了上面的**就可以很清晰的明白了,第幾個元素,是要輸入進add函式的,你輸入的i是幾,那麼這個元素就是樹狀陣列中的第幾個元素。與bit陣列無關,這個陣列只是為了實現特定的資料結構而存在的輔助函式罷了。
該題**是參考了別人的。。
#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
const int max_n = 20000+4;
ll cnt_bit[20005]=,distance_bit[20005]=;
int n;
struct point a[20005];
bool cmp(point a,point b)
return s;
}ll sum(ll *a,int i,int j)
void add(ll *bit,int i,int x)
}int main() {
ll tot = 0;
scanf("%d",&n);
memset(cnt_bit,0,sizeof(cnt_bit));
memset(distance_bit,0,sizeof(distance_bit));
for(int i=0;i
MooFest POJ 1990 樹狀陣列
傳送門 題意 給出牛的耳聾程度和牛所在的位置,之後求出每兩個牛所能聽到對方的聲音的和,每兩個牛的計算公式為max vi,vj xi xj 題解 首先暴力肯定是不行的,那麼可以按照牛的音量進行從小到大排序,然後維護兩個樹狀陣列,乙個維護此位置之前之後的牛的個數,另乙個維護此位置之前之後的牛的位置之和,...
poj 1990 樹狀陣列
開始對距離排序 然後果斷的tle了 然後發現應該對power排序,然後我們記錄和更新的是 比x小的個數與距離和,然後每次算的時候,因為按power排序了,當前的pi一定是最大的,所以就能在logdistance的時間內算出來 ac 如下 include include include include...
POJ 1990(樹狀陣列)
題目 一開始咋都想著得n n,畢竟pair在那擱著來,看了題解才知道原來可以用樹狀陣列 對於每個cow i 來說,由它的v i 決定的有兩部分,左邊部分和右邊部分,如果把cow關於v公升序排列,逐個求得由每個cow i 決定的volume,就可以復用前面的計數了 include include in...