樹狀陣列的兩道基本題

2021-08-05 20:22:55 字數 1889 閱讀 6327

上個周學習了樹狀陣列,但是沒有怎麼聽懂,今天學習了線段樹,較樹狀陣列更好理解一些,弄懂了線狀樹之後,重看樹狀陣列,感覺懂了一些。

我認為這兩種方法都是將二分巧妙地運用在搜尋的過程中,只不過方向相反,線狀樹是不斷二分的過程,樹狀陣列是不斷拼湊出樹的過程(將來深入理解之後說不定會推翻現在的想法,那誰知道呢,哈哈)。

今天先說樹狀陣列。有兩道題幫助我理解。

題一敵兵布陣,題二stars

題一屬於比較中規中矩的題,題二屬於需要拐點小彎的題,兩者都是完完整整的樹狀陣列,lowbit,getsum,add都寫上就可以出答案的那種。

具體的這三個函式都可以幹什麼就先不解釋了,因為我現在也是一知半解,等到真的可以融會貫通的時候再寫一篇總結吧。

敵兵布陣樹狀陣列版**

#include

using

namespace

std;

#include

#include

#include

const

int n = 500010;

int c[n];

int lowbit(int x)

//lowbit函式的作用就是讓二進位制數所有的高位1都消失,只留下最低位數的1,那其實像2,4,8這種

//數字,lowbit完了還是本身

int getsum(int i)//生成字首和

return s;

}void add(int i, int k)//新增或者說是更新需要維護的陣列,但其實需要維護的陣列並不存在,重要的是要修改c陣列

}int main()

cout

<< "case "

<< p << ":\n";

string order;

while (cin >> order)

}return

0;}

星星那道題的題意很重要,首先輸入時有規律的,先按照y的公升序輸入,如果y是一樣的,那麼久按照x的公升序輸入,那麼就可以忽略y座標,相當於把乙個二維的座標麵壓成乙個一維的座標軸,因為每一次輸入乙個點的座標的時候,都不存在y比他大的,只需要找出x比他小的就可以得出結論,那麼每次輸入,其實就是把要維護的a陣列的相應的位置的值+1,這個題的輸入是從0開始的,而樹狀陣列是不能處理0的,所以每乙個都要+1處理,大佬說這啟示我們,有的時候二維的東西可以先排序,然後化成一維的問題來解決!

stars**

#include

#include

#include

#include

using

namespace

std;

const

int maxn=15010;

const

int maxx=32010;

int c[maxx];//樹狀陣列的c陣列

int cnt[maxn];//統計結果

int lowbit(int x)

void add(int i,int val)

}int sum(int i)

return s;

}int main()

for(int i=0;iprintf("%d\n",cnt[i]);

}return

0;}

兩道簡單的題目

第一次發表文章,就發表兩到簡單點的題目好了 第一道題目是這樣的 現在有乙個整數的陣列,然後給定乙個目標數,我們要做的是找出陣列中唯一存在的兩個不同的數,其相加能夠得到這個目標數,然後返回這兩個數的下標比如 given nums 2,7,11,15 target 9,because nums 0 nu...

今晚的兩道 bc

第一道題 beautiful palindrome number 簡單組合計數問題,手算打表就好 大概十五分鐘左右搞定 第一次 提交竟然 wa了一次 有乙個小小的坑在那。author jusonalien email jusonalien qq.com school south china norm...

兩道筆試題的感觸

今天做了兩道筆試題,收益良多。有些題,你會發現,雖然並不難,但是卻很容易沒有思路或者出錯,這都是源自平時的不求甚解。很多知識點,自以為已經掌握,其實只是管中窺豹,可見一斑。不要一味墨守成規,也要用於思考,很多東西既要知其然,也要知其所以然。我一直覺得了解和精通中間差著十萬八千里,看來還有很長一段路要...