知识点整理-数据结构

一、数据结构

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.

posted @ 2020-08-04 21:23  梦中霜雪梨花白  阅读(197)  评论(0编辑  收藏  举报