知識點整理-資料結構
阿新 • • 發佈:2020-08-04
一、資料結構
1.DFS序:訪問一棵有根樹時DFS訪問結點的順序。設樹結點個數為\(n\)。
❤(1)入棧序:設將訪問的結點依次存到一個棧中,結點入棧的順序。
❤(2)出棧序:結點出棧的順序。
→入、出棧序的長度均為\(n\)。
❤(3)尤拉序:沿著邊走,經過的結點的順序。
→長度為\(2n-1\)。尤拉序中相鄰的點在樹上一定相鄰。
2.STL set
❤(1)set<Typename> S
宣告集合,儲存型別為Typename
的元素。
❤(2)S.insert(x)
插入元素x
。
❤(3)S.erase(x)
刪除元素x
,若未找到x
則什麼也不做。
❤(4)S.size(x)
返回集合元素數量;S.empty()
❤(5)
set<Typename>::iterator i
宣告迭代器。→迭代器的作用:通過它遍歷集合中的所有元素。相當於
for(int i=1;i<=n;i++)
中的i
。它支援operator++
和operator--
以訪問集合中的下/上一個元素。我們可以通過for(set<Typename>::iterator i=S.begin();i!=S.end();i++)
或for(auto i:S)
來遍歷set中的所有元素。注意直接使用時(也就是for
迴圈內部)要通過解引用運算子*i,i->
來訪問元素本身。❤(6)
(i=)S.upper_bound(x),S.lower_bound(x)
x
的第一個元素,返回迭代器。❤(7)
(i=)S.find(x)
找尋x
並返回它的迭代器,若為找到則返回末尾迭代器S.end()
。
3.ST表求LCA
❤(1)求樹的尤拉序,設待求兩點\(u,v\)在尤拉序第一次出現的位置為\(P_u,P_v\)。
❤(2)在尤拉序的子段[P_u,P_v]上找到一個尤拉序最小的點,它即是\(LCA(u,v)\)。
❤(3)因此我們可以通過ST表求出[P_u,P_v]中最小的值。
4.2-Pointer
問題:給定一個升序數列\(A\),求其中的兩個數字是它們的和為給定的數\(x\)。
❤(1)設l,r
是\(A\)的頭指標和尾指標。
❤(2)若A[l]+A[r]>x
r
向左移,否則l
向右移。重複這一步,知道找到
A[l]+A[r]=x
。可以證明,如果存在一組解,那麼它一定能找出來。
練習題:洛谷P1106,P1638,SP1805.