市赛前第五次培训讲义
An-Li Alt Ting October 27, 2014
Contents
1 C++ STL 1
1.1 Iterator . . . 1
1.2 Standard Containers . . . 2
1.3 Standard Algorithms . . . 2
2 C++ STL extensions 3 3 Classic Problems 3 3.1 Maximum Subarray 最大子数列 . . . 3
3.2 Inversion 逆序數對 . . . 3
3.3 Diameter of a Tree 樹直徑 . . . 4
3.4 Bipartite Test 二分圖判定 . . . 4
4 References 4
1 C++ STL
1.1 Iterator
Iterators基本上分为五种:Input、Output、Forward、Bidirectional、Random Access。
1.1.1 Input/Output Iterators
Input/output iterators 能够执行的连续的单一输入或输出。
1.1.2 Forward Iterators
Forward iterators 有 input iterators 与在非常数时的 output iterators的所有功能。而 它能够单向地在范围内迭代。所有标准容器都至少支援 forward iterators。
1.1.3 Bidirectional Iterators
Bidirectional iterators 有 forward iterators 的所有功能。而它能够双向地在范围内迭 代。
1.1.4 Random Access Iterators
Random access iterators有 bidirectional iterators 的所有功能。而它能够随机地迭代到 范围内的任何地方。
1.1.5 性质
所有 iterators都可以 copy-constuct、copy-assign、destruct、或者被递增。
Input iterators 可以使用等于或不等于比较运算子,可以作为右值被间接。
Mutable output iterators 可以被作为左值被间接。
Forward iterators 有 input iterators 与 mutable output iterators 的所有性质,可以 使用 default-construct,也都可以多传。
Bidirectional iterators有 forward iterators 的所有性质,可以被递减。
Random Access 有 bidirectional iterators 的所有性质,可以加、减、小于、大于、小 于等于、大于等于、加指定、减指定、偏量间接。
1.1.6 Functions advance
distance
1.2 Standard Containers
包含std::vector、std::deque、std::list、std::stack、std::queue、std::priority_queue、std::set、 std::multiset、std::map、std::multimap。
std::vector 的学习重点是std::vector::reserve。 std::list 的学习重点是std::list::splice。
1.3 Standard Algorithms
<algorithm>的学习重点是std::unique、std::random_shuffle、std::partition、std::nth_element、 std::lower_bound、std::upper_bound、std::equal_range、std::binary_search、std::push_heap、
std::pop_heap、std::make_heap、std::sort_heap、std::min_element、std::max_element、
std::lexicographical_compare、std::next_permutation、std::prev_permutation。
<numeric>的学习重点是std::accumulate、std::adjacent_difference、std::inner_product、
std::partial_sum。
2 C++ STL extensions
STL extensions from SGI
Plicy-Based Data Structures (PBDS)
3 Classic Problems
3.1 Maximum Subarray 最大子数列
最大子矩阵可以被视为最大子数列的一个变型。
3.1.1 Kadane’s Algorithm max_subarr A
x=p=0
for a in A
p= max (0 ,p+a) x= max (x,p) return x
3.1.2 Problems on OJs POJ 1050 To the Max 最大子矩阵。
HOJ 090 買賣土地 最大子矩阵。
3.2 Inversion 逆序數對
Inversion 逆序數對,是指對於一個序列 A 來說,滿足 i < j∧Ai > Aj 的數對 (i, j)。
輸出所有逆序數對的方法,可以使用枚舉法,TC:O(n2)。
計算所有逆序數對數量的方法,使用 merge sort 或Fenwick tree,TC:O(nlogn)。
Counting with merge sort
定義 f(r)為 range r 的逆序數對數量。
分治策略為:F([f, l)) =F([f, m)) +F([m, l)) +k,
其中 m=⌊f+l2 ⌋,k 為 i∈[f, m), j ∈[m, l)的逆序數對 (i, j) 數量。
其中 k 可以在 merge 兩sorted range 時,以 O(n) 的時間計算:
merge 中,每次 pop 一個右區間的數 n 時,其左區間長度即為 j = n 的逆序對數量,
累積之即可。
Counting with Fenwick tree
int inversion (){
int x =0;
for ( int i=n -1;i >=0;i - -){
x+= ft ::q(a[i ]);
ft ::u(a[i ] ,1);
}
return x;
}
3.2.1 Problems on OJs
HOJ 004 串珠珠問題
HOJ 039 餐廳評鑑 HOJ 126 交換字卡 HOJ 275 LASER
TIOJ 1080 A.逆序數對
3.3 Diameter of a Tree 樹直徑
3.3.1 Problems on OJs HOJ 115 樹之國
HOJ 334 樹之國 II
3.4 Bipartite Test 二分圖判定
4 References
http://www.cplusplus.com/reference/iterator/
http://en.wikipedia.org/wiki/Maximum_subarray_problem
http://en.wikipedia.org/wiki/Inversion_(discrete_mathematics)