上個周學習了樹狀陣列,但是沒有怎麼聽懂,今天學習了線段樹,較樹狀陣列更好理解一些,弄懂了線狀樹之後,重看樹狀陣列,感覺懂了一些。
我認為這兩種方法都是將二分巧妙地運用在搜尋的過程中,只不過方向相反,線狀樹是不斷二分的過程,樹狀陣列是不斷拼湊出樹的過程(將來深入理解之後說不定會推翻現在的想法,那誰知道呢,哈哈)。
今天先說樹狀陣列。有兩道題幫助我理解。
題一敵兵布陣,題二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...
兩道筆試題的感觸
今天做了兩道筆試題,收益良多。有些題,你會發現,雖然並不難,但是卻很容易沒有思路或者出錯,這都是源自平時的不求甚解。很多知識點,自以為已經掌握,其實只是管中窺豹,可見一斑。不要一味墨守成規,也要用於思考,很多東西既要知其然,也要知其所以然。我一直覺得了解和精通中間差著十萬八千里,看來還有很長一段路要...