作戰計劃
主線任務
支線任務
競賽資源簡介
演算法概論
- 演算法
- 排序與二分搜
- 雜項
- Exercise
- 鏈結串列 (Linked List)
- 堆疊 (Stack)
- 佇列 (Queue)
- 雜湊 (Hash)
如果输入的数字序列C不大,我们可以直接统计每个数字出现的次数。假设值都是0到C-1之间的整数。我们想要搜索索引值或按排序顺序最接近的值。我们可以每次取平均值并将搜索范围减半,得到复杂度为O(lgN)的算法。
Disjoint Sets
Path Compression
Union By Rank
Exercise
Binary Tree
- 定義
- 二元樹的儲存
- 二元樹的走訪
- Binary search tree
二叉搜索树(Binary Search Tree)是一种特殊的二叉树,它满足以下要求:对于任意节点v,其左子树中任意节点的键值均小于v的键值和其左子树中任意节点的键值。右子树小于键大于键 v 的值。
Heap
Binary Heap
与插入元素类似,我们直接替换树的根和最后一个元素,并将新的树根向下调整。
C++ Standard Library
- 簡介
- String
- IOStream
- STL Container
- STL Algorithm
- 枚舉
- 狀態空間搜索
- DFS 與 BFS
- BiBFS
- IDDFS
- A*
- IDA*
- Exercise
在 O(1) 时间内获取最大元素的值,并在 O(lgN) 时间内删除最大元素。
Greedy
Greedy Method (貪婪法)
Exercise
给定一个 N 个数字的序列,找到一种方法,使分割成 K 个段后每个段的最大和最小化。有一条大路,路上有N个城镇,每个城镇都有一些鱼。现在我们要运输这些鱼,以便每个城市都有Y吨或更多的鱼。但每运输一公里,就有一吨鱼被抢走。我想问一下K的最大值是多少? 。
Divide and Conquer
一些重要的遞迴式
Exercise
Dynamic Programming
- 實作方式
- Exercise-基本 DP
- Exercise-經典 DP
- DP on tree
- 需要想一下的 DP
- 狀態壓縮 DP
- 質數
- 輾轉相除法
- 同餘
- Exercise
N 个素数可被 N 整除。如果它们都不可整除,则说明 N 是质数。直到N。剩下的没有被删除的数字都是质数。
矩陣
- n 元一次方程組
- 高斯消去法
- 矩陣
- Exercise
一个矩阵乘以一个系数r:每个元素都乘以系数r,右边可以乘一个单位矩阵I(反正不影响):。
組合
- 基礎組合
- 遞迴式
- 卡特蘭數
- Exercise
以下情况中的方法数都是Cattleya数 Cn 正n边形中,将多边形划分为三角形的方法数。
計算幾何
- 向量
- 極座標
- 線段相交
- 多邊形面積
- 判斷點在多邊形之內外
- 凸包
- 掃描線 (Sweep Line)
- 判斷線段相交
- 旋轉卡尺 (Rotating Caliper)
- 最遠點對
- 最小包含圓
- Exercise
- 定義
- 圖的儲存
- Exercise
请输入图中所有顶点的入度总和 请输入图中所有顶点的入度总和。
子圖與特殊的圖
定義
一些特殊的圖
G 是连通的,但如果删除一条边,G 就会断开。 G 中的任意两个顶点只能通过一条简单路径连接。
Exercise
如果图 G 可以在平面上绘制,并且其边仅在端点处相交,则称 G 是平面图(Planar . Graph)。平面图的边将平面划分为不同的区域,称为面,记为 F。平面图包括著名的欧洲面。
圖的遍歷與時間戳記
深度優先搜索
時間戳記
中的区间,即这个序列为我们提供了一种平滑树的方法。给定DFS的条目时间戳,我们可以知道树T上点v的任何子节点的条目时间戳必须小于v的条目时间戳,并且对于any和vi,如果i,vj是v的后代< k < j,那么vk也必须是v的后代,否则我们进入和退出点v两次,因此DFS条目时间戳恰好是一个合法的序列。
Exercise
連通元件
連通元件
类似地,我们通常讨论无向图中边的双重连通性。我们说两个点 u 和 v 是边的两倍。如果 和 是 如果删除图中的任何边,仍然会有从 u 到 v 的链接或 v 到 u 的路径。双边分量类似于有向图中的强连通分量。它将原始图G中的点集V分割成不同的不重叠的分量V1,V2,…,Vn。从定义可知,图G中的环将在边上属于同一个强连通分量,因此我们也可以减少该点并将其返回到图G'。而E(G')中的边会造成一对不相连的边,称为桥。
Tarjan’s algorithm
如果我们考虑有向图中的强连通元素,我们可以知道,如果DFS树中存在一个点v使得Low(v),那么它是一个点双连通元素,它的交集将是两点。双连接元素。
Exercise
对于下面括号中的公式,我们如何在图上构造一条边? (下图i̸=j) 1.如果所有xi,Øxi不在同一个强连通分量中,是否有确定解?如何找到一套解决方案? 。
圖論上的問題 (I)
歐拉路徑與歐拉迴路
漢米頓路徑與迴路
虽然这个问题乍一看与欧亚路径非常相似,但它只需要遍历所有的点,而不是所有的边。但目前为止还没有好的办法解决这个问题!事实上,这个问题是NP-Complete,目前最好的做法是使用状态压缩DP来达到O(|V|22|V|)的时间复杂度。
Exercise
圖論上的問題 (II)
- 最小生成樹
- 單源最短路徑
- All-Pair Shortest Path
- Exercise
- 名詞解釋
- 匹配問題 (String Matching)
如果图G中存在负环,且最小边权值为wmin,则可以将所有边权值与wmin相加。当然,我们可以为所有点做一条单向最短路径,时间复杂度也很好,但我们将呈现一种简洁的Floyd-Warshall算法。
SA 數組、LCP 定理
- Doubling Algorithm(倍增算法)
- Longest Common Prefix (LCP) 定理
- 後記
- 塊狀數組
- 線段樹
- 二元搜尋樹
线段树是一种可以在区间内快速改变(更新)和查询(查询)值的二叉树。为了更容易理解线段树的结构和操作,我们首先讨论一个简单的问题:通过观察,我们可以发现每个元素最多会被覆盖,因为树的深度是O(lgn)。更改时为 O(lgn) 个分段,因此更改此值最多只会影响 O(lgn) 个分段中的最小值。查询时,由于每层都会被完全覆盖,不超过2段,。
實作
因此,总覆盖率最多为O(lgn)个段,即查询时最多需要检查O(lgn)个段,复杂度也为O(lgn)。如果我们离线处理问题,即我们知道所有的输入数据,那么可以使用线段树代替二叉搜索树,优点是树结构可以完全平衡。方法是出现的数的区间最小值。插入操作将其从序列中弹出,并更新覆盖该点的所有间隔的最小值。删除操作与插入操作类似。
操作
將一段數字加減一個值
將一段數字全部改成一個數
推廣與變形
Binary Indexed Tree
要表示一个区间,可以直接将所有区间的结果跟踪为一个索引值为[1, n]的数组。如果我们总结记录的间隔,我们会得到一个公式。索引值为k的节点所持有的区间为(k−2i,k],i称为k的低位,是二进制表示中的最低位。-零位,lowbit,可以用以下表示公式。
K 維線段樹
應用
離散化 (Discretization)
掃描線 (Sweep Line)
時間戳記 (Time Stamp)
樹上詢問 (Tree Queries)
Exercise
- 單調隊列優化
- 四邊形優化
- 插頭 DP
- Exercise
而这里我们将讨论一些神奇的优化方法。为了达到一定的单调性,下面我们一一讨论。
其他的主題
- 最近共同祖先 (LCA)
- 比率二分搜
- 迭代
- 合併演算法
- Exercise
树的根开始DFS。每次我们输入一个节点时,我们都会将该点添加到序列的末尾,每次我们都会留下一个。 1RMQ问题,如果有的话,可以使用特殊的方法来实现O(N)的时间复杂度。如果您有兴趣,可以自行研究。
Flow & Cut
- 定義
- Maximum flow Algorithm
- Minimum Cost Maximum Flow
- 最小割
- 建構模型
- Exercise
小路。通过这个定理,我们可以找到最大电流,如果我们用 BFS 实现它,我们可以实现 O(V E2) 的时间复杂度。