• Tidak ada hasil yang ditemukan

市赛前第五次培训讲义

N/A
N/A
Protected

Academic year: 2023

Membagikan "市赛前第五次培训讲义"

Copied!
5
0
0

Teks penuh

(1)

市赛前第五次培训讲义

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。

(2)

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。

(3)

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 買賣土地 最大子矩阵。

(4)

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 ki∈[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 樹直徑

(5)

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)

Referensi

Dokumen terkait

Based on the research results, it can be concluded that the application of Arabic language learning based on higher-order thinking skills in MAN 1 Kota