POJ 2481 Cows 樹狀陣列

2021-08-21 16:52:18 字數 1168 閱讀 7811

樹狀陣列:

樹狀陣列是乙個查詢和修改複雜度都為log(n)的資料結構,假設陣列a[1..n],

用lowbit函式維護了乙個樹的結構

支援隨時修改某個元素的值,複雜度也為log級別。

來觀察這個圖:

令這棵樹的結點編號為c1,c2...cn。令每個結點的值為這棵樹的值的總和,那麼容易發現:

c1 = a1

c2 = a1 + a2

c3 = a3

c4 = a1 + a2 + a3 + a4

c5 = a5

c6 = a5 + a6

c7 = a7

c8 = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8

c16 = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12 + a13 + a14 + a15 + a16

這裡有乙個有趣的性質:

設節點編號為x,那麼這個節點管轄的區間為2^k(其中k為x二進位制末尾0的個數)個元素。因為這個區間最後乙個元素必然為ax,

所以很明顯:cn = a(n – 2^k + 1) + ... + an

算這個2^k有乙個快捷的辦法,定義乙個函式如下即可:

int lowbit(int x)a[100005];

bool cmp(ac a,ac b) //對資料進行排序

int lowbit(int i)

void update(int i, int x)

}

int sum(int i)

return sum;

}

int main()

sort(a, a+n, cmp);

val[a[0].id] = sum(a[0].x); //val[i]表示在i點有多少大於i的範圍的點

update(a[0].x, 1);

for(i = 1; i < n; i++)

cout<

for(i = 1; i < n; i++)

cout<

} return 0;

}

POJ 2481 Cows 樹狀陣列

樹狀陣列 其實這題和 poj 2352 或者 就是道用樹狀陣列求逆序數的題目。先排序,我的排序是按照先s從小到大,如果s相等 e從大到小。貌似也沒什麼了。就樹狀陣列吧。include include include include include define inf 0x7fffffff defi...

poj 2481 Cows (樹狀陣列)

小記 之前沒做什麼修改之前,在poj上提交1393ms ac了。然後在hdu的web diy裡提交gnu c 超時了 於是不斷的改,在輸出的地方花費時間太多了。就是為了保證每兩個數之間有乙個空格,然後末尾沒有空格,我在for裡面加了乙個判斷,只要不是末尾就輸出乙個空格。然後就這樣超時了。樹狀陣列全用...

poj 2481 Cows(樹狀陣列)

題意 山坡上長滿三葉草,給定一群牛和他們喜愛的範圍 s,ei 如果一頭牛的s小於等於另一頭牛而e大於等於另一頭牛的,且s和e不同時相等,那麼這頭牛就比另一頭牛強壯。可以先對e從大到小排序,這樣保證遍歷時後出現的牛的上界一定滿足小於等於前面的,這樣只需要判斷他的下界滿不滿足就行,這就想到了用樹狀陣列。...