MooFest POJ 1990 樹狀陣列)

2021-07-02 04:43:22 字數 1347 閱讀 2378

最近學習了一下樹狀陣列,這道題糾結了很久,終究是因為沒有明白樹狀陣列怎麼用。

感覺網上許多大神都只是講原理,對於我們這些初學的菜鳥恐怕都被嚇跑了。

這裡我就以實用主義說一下使用方法(其實我覺得其原理應該能對我們更有啟發,也許會帶來很多潛在的好處):

這裡需要注意的是,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...