一、数据结构
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.