rmq演算法
❶ 程序員必須掌握哪些演算法
一.基本演算法:
枚舉. (poj1753,poj2965)
貪心(poj1328,poj2109,poj2586)
遞歸和分治法.
遞推.
構造法.(poj3295)
模擬法.(poj1068,poj2632,poj1573,poj2993,poj2996)
二.圖演算法:
圖的深度優先遍歷和廣度優先遍歷.
最短路徑演算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
最小生成樹演算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
拓撲排序 (poj1094)
二分圖的最大匹配 (匈牙利演算法) (poj3041,poj3020)
最大流的增廣路演算法(KM演算法). (poj1459,poj3436)
三.數據結構.
串 (poj1035,poj3080,poj1936)
排序(快排、歸並排(與逆序數有關)、堆排) (poj2388,poj2299)
簡單並查集的應用.
哈希表和二分查找等高效查找法(數的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
哈夫曼樹(poj3253)
堆
trie樹(靜態建樹、動態建樹) (poj2513)
四.簡單搜索
深度優先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)
廣度優先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)
簡單搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.動態規劃
背包問題. (poj1837,poj1276)
型如下表的簡單DP(可參考lrj的書 page149):
E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最長公共子序列) (poj3176,poj1080,poj1159)
C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最優二分檢索樹問題)
六.數學
組合數學:
1.加法原理和乘法原理.
2.排列組合.
3.遞推關系.
(POJ3252,poj1850,poj1019,poj1942)
數論.
1.素數與整除問題
2.進制位.
3.同餘模運算.
(poj2635, poj3292,poj1845,poj2115)
計算方法.
1.二分法求解單調函數相關知識.(poj3273,poj3258,poj1905,poj3122)
七.計算幾何學.
幾何公式.
叉積和點積的運用(如線段相交的判定,點到線段的距離等). (poj2031,poj1039)
多邊型的簡單演算法(求面積)和相關判定(點在多邊型內,多邊型是否相交)
(poj1408,poj1584)
凸包. (poj2187,poj1113)
中級(校賽壓軸及省賽中等難度):
一.基本演算法:
C++的標准模版庫的應用. (poj3096,poj3007)
較為復雜的模擬題的訓練(poj3393,poj1472,poj3371,poj1027,poj2706)
二.圖演算法:
差分約束系統的建立和求解. (poj1201,poj2983)
最小費用最大流(poj2516,poj2516,poj2195)
雙連通分量(poj2942)
強連通分支及其縮點.(poj2186)
圖的割邊和割點(poj3352)
最小割模型、網路流規約(poj3308)
三.數據結構.
線段樹. (poj2528,poj2828,poj2777,poj2886,poj2750)
靜態二叉檢索樹. (poj2482,poj2352)
樹狀樹組(poj1195,poj3321)
RMQ. (poj3264,poj3368)
並查集的高級應用. (poj1703,2492)
KMP演算法. (poj1961,poj2406)
四.搜索
最優化剪枝和可行性剪枝
搜索的技巧和優化 (poj3411,poj1724)
記憶化搜索(poj3373,poj1691)
五.動態規劃
較為復雜的動態規劃(如動態規劃解特別的旅行商TSP問題等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
記錄狀態的動態規劃. (POJ3254,poj2411,poj1185)
樹型動態規劃(poj2057,poj1947,poj2486,poj3140)
六.數學
組合數學:
1.容斥原理.
2.抽屜原理.
3.置換群與Polya定理(poj1286,poj2409,poj3270,poj1026).
4.遞推關系和母函數.
數學.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
2.概率問題. (poj3071,poj3440)
3.GCD、擴展的歐幾里德(中國剩餘定理) (poj3101)
計算方法.
1.0/1分數規劃. (poj2976)
2.三分法求解單峰(單谷)的極值.
3.矩陣法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
隨機化演算法(poj3318,poj2454)
雜題(poj1870,poj3296,poj3286,poj1095)
七.計算幾何學.
坐標離散化.
掃描線演算法(例如求矩形的面積和周長並,常和線段樹或堆一起使用)
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
多邊形的內核(半平面交)(poj3130,poj3335)
幾何工具的綜合應用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)
高級(regional中等難度):
一.基本演算法要求:
代碼快速寫成,精簡但不失風格
(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)
保證正確性和高效性. poj3434
二.圖演算法:
度限制最小生成樹和第K最短路. (poj1639)
最短路,最小生成樹,二分圖,最大流問題的相關理論(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
最優比率生成樹. (poj2728)
最小樹形圖(poj3164)
次小生成樹.
無向圖、有向圖的最小環
三.數據結構.
trie圖的建立和應用. (poj2778)
LCA和RMQ問題(LCA(最近公共祖先問題) 有離線演算法(並查集+dfs) 和 在線演算法(RMQ+dfs)).(poj1330)
雙端隊列和它的應用(維護一個單調的隊列,常常在動態規劃中起到優化狀態轉移的目的). (poj2823)
左偏樹(可合並堆).
後綴樹(非常有用的數據結構,也是賽區考題的熱點).(poj3415,poj3294)
四.搜索
較麻煩的搜索題目訓練(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
廣搜的狀態優化:利用M進制數存儲狀態、轉化為串用hash表判重、按位壓縮存儲狀態、雙向廣搜、A*演算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)
深搜的優化:盡量用位運算、一定要加剪枝、函數參數盡可能少、層數不易過大、可以考慮雙向搜索或者是輪換搜索、IDA*演算法. (poj3131,poj2870,poj2286)
五.動態規劃
需要用數據結構優化的動態規劃.(poj2754,poj3378,poj3017)
四邊形不等式理論.
較難的狀態DP(poj3133)
六.數學
組合數學.
1.MoBius反演(poj2888,poj2154)
2.偏序關系理論.
博奕論.
1.極大極小過程(poj3317,poj1085)
2.Nim問題.
七.計算幾何學.
半平面求交(poj3384,poj2540)
可視圖的建立(poj2966)
點集最小圓覆蓋.
對踵點(poj2079)
❷ ACM進階指南
大一上學期:
必學:
1.C語言基礎語法必須全部學會
a)推薦「語言入門」分類20道題以上
b)提前完成C語言課程設計
2.簡單數學題(推薦「數學」分類20道以上)
需要掌握以下基本演算法:
a)歐幾里德演算法求最大公約數
b)篩法求素數
c)康托展開
d)逆康托展開
e)同餘定理
f)次方求模
3.計算幾何初步
a)三角形面積
b)三點順序
4.學會簡單計算程序的時間復雜度與空間復雜度
5.二分查找法
6.簡單的排序演算法
a)冒泡排序法
b)插入排序法
7.貪心演算法經典題目
8.高等數學
以下為選修:
9.學會使用簡單的DOS命令(較重要)
a)color/dir//shutdown/mkdir(md)/rmdir(rd)/attrib/cd/
b)知道什麼是絕對路徑與相對路徑
c)學會使用C語言調用DOS命令
d)學會在命令提示符下調用你自己用C語言編寫的程序,並使用命令行參數給自己的程序傳參(比如自己製作一個file.exe實現與命令基本功能一致的功能)
e)學會編寫bat批處理文件
10.學會Windows系統的一些小知識,如設置隱藏文件,autoRun.inf的設置等。
11.學會編輯注冊表(包括使用注冊表編輯器regedit和使用DOS命令編輯注冊表)
12.學會使用組策略管理器管理(gpedit.msc)組策略。
大一下學期:
1.掌握C++部分語法,如引用類型,函數重載等,基本明白什麼是類。
2.學會BFS與DFS
a)迷宮求解(最少步數)
b)水池數目(NYOJ27)
c)圖像有用區域(NYOJ92)
d)樹的前序中序後序遍歷
3.動態規劃(15題以上),要學會使用循環的方法寫動態規劃,同時也要學會使用記憶化搜索的方法。
a)最大子串和
b)最長公共子序列
c)最長單調遞增子序列(O(n)與O(n log n)演算法都需要掌握)
d)01背包
e)RMQ演算法
4.學會分析與計算復雜程序的時間復雜度
5.學會使用棧與隊列等線性存儲結構
6.學會分治策略
7.排序演算法
a)歸並排序
b)快速排序
c)計數排序
8.數論
a)擴展歐幾里德演算法
b)求逆元
c)同餘方程
d)中國剩餘定理
9.博弈論
a)博弈問題與SG函數的定義
b)多個博弈問題SG值的合並
10.圖論:
a)圖的鄰接矩陣與鄰接表兩種常見存儲方式
b)歐拉路的判定
c)單最短路bellman-ford演算法dijkstra演算法。
d)最小生成樹的kruskal演算法與prim演算法。
11.學會使用C語言進行網路編程與多線程編程
12.高等數學
13.線性代數
a)明確線性代數的重要性,首先是課本必須學好
b)編寫一個Matrix類,進行矩陣的各種操作,並求編寫程序解線性方程組。
c)推薦做一兩道「矩陣運算」分類下的題目。
以下為選修,隨便選一兩個學學即可:
14.(較重要)使用C語言或C++編寫簡單程序來調用一些簡單的windows API,或者在linux下進行linux系統調用,其目的是明白什麼是API(應用程序介面)。
15.網頁設計
a)學習靜態網頁技術(html+css+javascript)
b)較具有藝術細胞的可以試試Photoshop
c)php或其它動態網頁技術
16.學習matlab,如果想參加數學建模大賽的話,需要學這個軟體。
大一假期(如果留校集訓)
1.掌握C++語法,並熟練使用STL
2.試著實現STL的一些基本容器和函數,使自己基本能看懂STL源碼
3.圖論
a)使用優先隊列優化Dijkstra和Prim
b)單源最短路徑之SPFA
c)差分約束系統
d)多源多點最短路徑之FloydWarshall演算法
e)求歐拉路(圈套圈演算法)
4.進行復雜模擬題訓練
5.拓撲排序
6.動態規劃進階
a)完全背包、多重背包等各種背包問題(參見背包九講)
b)POJ上完成一定數目的動態規劃題目
c)狀態壓縮動態規劃
d)樹形動態規劃
7.搜索
a)回溯法熟練應用
b)復雜的搜索題目練習
c)雙向廣度優先搜索
d)啟發式搜索(包括A*演算法,如八數碼問題)
8.計算幾何
a)判斷點是否在線段上
b)判斷線段相交
c)判斷矩形是否包含點
d)判斷圓與矩形關系
e)判斷點是否在多邊形內
f)判斷點到線段的最近點
g)計算兩個圓的公切線
h)求矩形的並的面積
i)求多邊形面積
j)求多邊形重心
k)求凸包
選修
9.可以學習一種C++的開發框架來編寫一些窗體程序玩玩(如MFC,Qt等)。
10.學習使用C或C++連接資料庫。
大二一整年:
1.數據結構
a)單調隊列
b)堆
c)並查集
d)樹狀數組
e)哈希表
f)線段樹
g)字典樹
2.圖論
a)強連通分量
b)雙連通分量(求割點,橋)
c)強連通分量與雙連通分量縮點
d)LCA、LCA與RMQ的轉化
e)二分圖匹配
i.二分圖最大匹配
ii.最小點集覆蓋
iii.最小路徑覆蓋
iv.二分圖最優匹配
v.二分圖多重匹配
f)網路流
i.最大流的基本SAP
ii.最大流的ISAP或者Dinic等高效演算法(任一)
iii.最小費用最大流
iv.最大流最小割定理
3.動態規劃多做題提高(10道難題以上)
4.數論
a)積性函數的應用
b)歐拉定理
c)費馬小定理
d)威樂遜定理
5.組合數學
a)群論基礎
b)Polya定理與計數問題
c)Catalan數
6.計算幾何
a)各種旋轉卡殼相關演算法
b)三維計算幾何演算法
7.理解資料庫原理,學會SQL語句
8.學好計算機組成原理
9.學習Transact-SQL語言,學會使用觸發器,存儲過程,學會資料庫事務等。
10.圖論二
a)網路流的各種構圖訓練(重要)
b)最小割與最小點權覆蓋等的關系(詳見《最小割模型在信息學競賽中的應用》一文)
c)次小生成樹
d)第k短路
e)最小比率生成樹
11.線性規劃
12.動態規劃更高級進階
13.KMP演算法
14.AC自動機理論與實現
15.博弈論之Alpha-beta剪枝