也算是接下來二十天的複習計劃吧
僅止於聯賽難度左右
基礎算法
字符串
char[]
- cstring
- memset()
- 輸入無&
- gets(), fgets(stdin, ,);
- strcmp, strcpy, strcat
string
- string
- cin, getline(cin,s)
ios::sync_with_stdio(false); - > 只能用cin
子串匹配
- 暴力匹配
- hash哈希
- trie樹 字典樹
- kmp
- AC自動機 (trie樹上做kmp)
迴文串
- 暴力匹配 n^2
- manacher 馬拉車 O(n)
數論
- gcd() 求最大公約數 / 最小公倍數 輾轉相除法
- 快速冪 任意一個整數轉換爲 2^a+2^b+2^c
- 求質數
- 普通
- 素數篩
- 埃氏篩法
- O(n)歐拉篩
- 乘法逆元
- 用一個遞推式 求一個結果
- 題目要求取模
- 遞推式裏有除法運算 不能直接在每一步取模
- 排列組合
- 求組合數 C(n,m) = n! / m!(n-m)!
- 組合數可以用遞推 (楊輝三角形)
- 離散化
- 分治
- 擴展歐幾里得
- 矩陣乘法
- 進制轉換
- 位運算
排序算法
- 選擇 冒泡 排序
- 快速排序 (不穩定)
- 歸併排序 逆序對
- 桶排序(去重)
- 重載運算符
STL
- string
- queue
- deque (雙端隊列)
- stack
- priority_queue
- map (映射)stl的哈希表, 需要重載運算符號
- 每次操作O(logn)
- set 集合,會去重
- vector
- bitset
- bool vis[] = true/false. 1 byte = 8 bits
- 只用一個bit儲存1/0
- lower_bound(), upper_bound(),
- sort
- unique
- 只能在排好序,升序的序列用
- 會把所有重複的元素,移到最後去
- ==,cmp
高精度
搜索
- 深度優先 (可行性問題)
- 迭代搜索 (深度/求步數)
- 記憶化搜索
- 剪枝 / 各種黑暗剪枝 (套廣搜來剪枝)
- 啓發式搜索
- A* / IDA
- 廣度優先 (求步數)
- spfa
- 分層圖
## 暴力算法
- 枚舉
- 模擬
- 隨機化
遞歸/遞推
一維遞推
二維遞推
寫暴力搜索,打表,找規律
矩陣快速冪 優化
貪心算法
二分算法
動態規劃
- 最長不下降子序列
- 攔截導彈 O(n ^2 )
- O(n log n )算法*
- 揹包問題
- 揹包九講
- 普通DP
- 遞推比較像
- 比較複雜
- -> 先暴搜
- -> 找規律 注意各類參數 1-i i-n
- 狀壓DP
- 樹形DP
圖論
- 度 歐拉回路
- 拓撲排序(可能跟DP結合)
- 最短路算法
- floyed 暴力
- dijkstra
- pq優先隊列的優化(推薦)
- spfa 判負環(求最大路>判正環)
- 強連通分量
- korasaju
- -> 正dfs + 反dfs
- tarjan
- low, dfn
- korasaju
- 二分圖匹配 (求最大匹配)
- 匈牙利算法
- 樹上算法
- 樹的三種遍歷方式
- 最小生成樹
- LCA 最近公共祖先
- tarjan
- 倍增
- 樹鏈剖分 -> 區間修改/查詢
數據結構
棧
- 單調棧
隊列
- 單調隊列
鏈表
- 圖論 -> 鄰接鏈表
並查集
左偏樹
RMQ
莫隊(算法)
前綴和
差分
樹狀數組
ST表
線段樹
- lazy_tag
- 可持久化線段樹
- 主席樹
簽到題100分拿滿
DP/遞推 -> 暴力(模擬,搜索,貪心) 20 ~ 50 , 打表++
碼農搜索題 --> 50+
數論相關 --> 先算, 暴力
圖論相關-->
- 樹上
- 倍增
- 樹鏈剖分
- 圖上
- 遍歷
- 拓撲序
- 圖上獲得的數據再DP
數據結構 暴力 30-50, 正解可以多花時間/換角度
二分 / 貪心
貪心/二分/搜索/dp遞推
NOIP 2015 - 2018
存算法/數據結構模板(複習不熟悉的,寫不出來的算法)