ACM大量習題題庫及建議培養計劃
阿新 • • 發佈:2019-02-20
ACM大量習題題庫
ACM大量習題題庫
現在網上有許多題庫,大多是可以線上評測,所以叫做Online Judge。除了USACO是為IOI準備外,其餘幾乎全部是大學的ACM競賽題庫。
USACO
http://ace.delos.com/usacogate
美國著名線上題庫,專門為資訊學競賽選手準備
TJU
http://acm.tongji.edu.cn/
同濟大學線上題庫,唯一的中文題庫,適合NOIP選手
ZJU
http://acm.zju.edu.cn/
浙江大學線上題庫
JLU
http://acm.jlu.edu.cn/
吉林大學線上題庫(一直上不去)
PKU
http://acm.pku.edu.cn
北京大學線上題庫
URAL
http://acm.timus.ru
俄羅斯烏拉爾大學線上題庫
SGU
http://acm.sgu.ru/
俄羅斯聖薩拉托夫州大學線上題庫
ELJ
http://acm.mipt.ru/judge/bin/problems.pl?lang=en
俄羅斯莫斯科物理技術學院
SPOJ
https://spoj.sphere.pl/
波蘭格但斯克理工大學
UVA
http://acm.uva.es/
西班牙的Universidad de Valladolid線上題
ACM聯絡建議
一位高手對我的建議:
一般要做到50行以內的程式不用除錯、100行以內的二分鐘內除錯成功.acm主要是考演算法的
,主要時間是花在思考演算法上,不是花在寫程式與debug上。
下面給個計劃你練練:
第一階段:
練經典常用演算法,下面的每個演算法給我打上十到二十遍,同時自己精簡程式碼,
因為太常用,所以要練到寫時不用想,10-15分鐘內打完,甚至關掉顯示器都可以把程式打
出來.
1.最短路(Floyd、Dijstra,BellmanFord)
2.最小生成樹(先寫個prim,kruscal要用並查集,不好寫)
3.大數(高精度)加減乘除
4.二分查詢. (程式碼可在五行以內)
5.叉乘、判線段相交、然後寫個凸包.
6.BFS、DFS,同時熟練hash表(要熟,要靈活,程式碼要簡)
7.數學上的有:輾轉相除(兩行內),線段交點、多角形面積公式.
8. 呼叫系統的qsort, 技巧很多,慢慢掌握.
9. 任意進位制間的轉換
第二階段:
練習複雜一點,但也較常用的演算法。
如:
1. 二分圖匹配(匈牙利),最小路徑覆蓋
2. 網路流,最小費用流。
3. 線段樹.
4. 並查集。
5. 熟悉動態規劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp
6.博弈類演算法。博弈樹,二進位制法等。
7.最大團,最大獨立集。
8.判斷點在多邊形內。
9. 差分約束系統.
10. 雙向廣度搜索、A*演算法,最小耗散優先.
第三階段:
前兩個階段是打基礎,第三階段是鍛鍊在比賽中可以快速建立模型、想新演算法
。這就要平時多做做綜合的題型了。
1. 把oibh上的論文看看(大概幾百篇的,我只看了一點點,呵呵)。
2. 平時掃掃zoj上的難題啦,別老做那些不用想的題.(中大acm的版主經常說我挑簡單的來
做:-P )
3. 多參加網上的比賽,感受一下比賽的氣氛,評估自己的實力.
4. 一道題不要過了就算,問一下人,有更好的演算法也打一下。
5. 做過的題要記好 :-)
ACM ICPC學習計劃
大牛給的計劃——
一般要做到50行以內的程式不用除錯、100行以內的二分鐘內除錯成功.acm主要是考演算法的,主要時間是花在思考演算法上,不是花在寫程式與debug上。
下面給個計劃你練練:
第一階段:練經典常用演算法,下面的每個演算法給我打上十到二十遍,同時自己精簡程式碼,
因為太常用,所以要練到寫時不用想,10-15分鐘內打完,甚至關掉顯示器都可以把程式打
出來.
1.最短路(Floyd、Dijstra,BellmanFord)
2.最小生成樹(先寫個prim,kruscal要用並查集,不好寫)
3.大數(高精度)加減乘除
4.二分查詢. (程式碼可在五行以內)
5.叉乘、判線段相交、然後寫個凸包.
6.BFS、DFS,同時熟練hash表(要熟,要靈活,程式碼要簡)
7.數學上的有:輾轉相除(兩行內),線段交點、多角形面積公式.
8. 呼叫系統的qsort, 技巧很多,慢慢掌握.
9. 任意進位制間的轉換
第二階段:練習複雜一點,但也較常用的演算法。
如:
1. 二分圖匹配(匈牙利),最小路徑覆蓋
2. 網路流,最小費用流。
3. 線段樹.
4. 並查集。
5. 熟悉動態規劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp
6.博弈類演算法。博弈樹,二進位制法等。
7.最大團,最大獨立集。
8.判斷點在多邊形內。
9. 差分約束系統.
10. 雙向廣度搜索、A*演算法,最小耗散優先.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ACMer必備知識(這麼多呀,慢慢學了……
圖論
路徑問題
0/1邊權最短路徑
BFS
非負邊權最短路徑(Dijkstra)
可以用Dijkstra解決問題的特徵
負邊權最短路徑
Bellman-Ford
Bellman-Ford的Yen-氏優化
差分約束系統
Floyd
廣義路徑問題
傳遞閉包
極小極大距離 / 極大極小距離
Euler Path / Tour
圈套圈演算法
混合圖的 Euler Path / Tour
Hamilton Path / Tour
特殊圖的Hamilton Path / Tour 構造
生成樹問題
最小生成樹
第k小生成樹
最優比率生成樹
0/1分數規劃
度限制生成樹
連通性問題
強大的DFS演算法
無向圖連通性
割點
割邊
二連通分支
有向圖連通性
強連通分支
2-SAT
最小點基
有向無環圖
拓撲排序
有向無環圖與動態規劃的關係
二分圖匹配問題
一般圖問題與二分圖問題的轉換思路
最大匹配
有向圖的最小路徑覆蓋
0 / 1矩陣的最小覆蓋
完備匹配
最優匹配
穩定婚姻
網路流問題
網路流模型的簡單特徵和與線性規劃的關係
最大流最小割定理
最大流問題
有上下界的最大流問題
迴圈流
最小費用最大流 / 最大費用最大流
弦圖的性質和判定
組合數學
解決組合數學問題時常用的思想
逼近
遞推 / 動態規劃
概率問題
Polya定理
計算幾何 / 解析幾何
計算幾何的核心:叉積 / 面積
解析幾何的主力:複數
基本形
點
直線,線段
多邊形
凸多邊形 / 凸包
凸包演算法的引進,捲包裹法
Graham掃描法
水平序的引進,共線凸包的補丁
完美凸包演算法
相關判定
兩直線相交
兩線段相交
點在任意多邊形內的判定
點在凸多邊形內的判定
經典問題
最小外接圓
近似O(n)的最小外接圓演算法
點集直徑
旋轉卡殼,對踵點
多邊形的三角剖分
數學 / 數論
最大公約數
Euclid演算法
擴充套件的Euclid演算法
同餘方程 / 二元一次不定方程
同餘方程組
線性方程組
高斯消元法
解mod 2域上的線性方程組
整係數方程組的精確解法
矩陣
行列式的計算
利用矩陣乘法快速計算遞推關係
分數
分數樹
連分數逼近
數論計算
求N的約數個數
求phi(N)
求約數和
快速數論變換
……
素數問題
概率判素演算法
概率因子分解
資料結構
組織結構
二叉堆
左偏樹
二項樹
勝者樹
跳躍表
樣式圖示
斜堆
reap
統計結構
樹狀陣列
虛二叉樹
線段樹
矩形面積並
圓形面積並
關係結構
Hash表
並查集
路徑壓縮思想的應用
STL中的資料結構
vector
deque
set / map
動態規劃 / 記憶化搜尋
動態規劃和記憶化搜尋在思考方式上的區別
最長子序列系列問題
最長不下降子序列
最長公共子序列
最長公共不下降子序列
一類NP問題的動態規劃解法
樹型動態規劃
揹包問題
動態規劃的優化
四邊形不等式
函式的凸凹性
狀態設計
規劃方向
線性規劃
常用思想
二分
最小表示法
串
KMP
Trie結構
字尾樹/字尾陣列
LCA/RMQ
有限狀態自動機理論
排序
選擇/冒泡
快速排序
堆排序
歸併排序
基數排序
拓撲排序
排序網路
熟練掌握資料結構、常用演算法匯聚
(一)
不可能都完全記住那麼多的演算法.
常用演算法,拿過來就可以寫出來
不常用的,拿起書來,看10分鐘,就能理解演算法(因為以前記過).
對以前沒有記過的演算法,就不好說了,難的可能要研究好幾天.
這樣就可以了.
應該熟練掌握的常用的演算法應該有:
各種排序演算法(插入排序、氣泡排序、選擇排序,快速排序,堆排序,歸併排序)
線性表(一般的線性表,棧,佇列)的插入和刪除
二叉樹的遍歷(前序,中序,後序)
圖的遍歷(深度優先,廣度優先)
二分法查詢,排序二叉樹,Hash查詢(處理衝突的方法)。
(二)
分析一個東西,你可以用不同的眼光去看待,有很多時候,就跟自己生活一樣,覺得小時候看待問題很幼稚,現在看問題全面了,而且方式不一樣了,為什麼,就是成長吧,就跟這個一樣的,你對演算法,比如寫一個程式,可能直接寫很簡單,可是可以有一些有趣的方式,比如通過什麼樣來表達,怎麼樣更高效..等等吧
(三)
於大學裡把基本的專業課學紮實就ok,如:資料結構,離散,作業系統等。碰到一些基本的資料結構和演算法,如查詢排序要根據原理馬上能寫出相應的程式碼就行了,我個人是這樣理解的,對於更深層次的東西,也是建立在自己熟練的基礎之上的吧
(四)
演算法與資料結構考驗試題精析》第2版 機械工業出版社
如果你想練習的話,這裡有N多的題可以來練習,但實際中能用到的比較少,除非搞一些高階的玩意,不過平時也可以在自己的專案中結合使用
(五)
資料結構在平時可能用不上,但資料結構可以培養你程式時如果注意效率的意識,一個學過資料結構的人和一個沒有學過數結構的人寫出來的程式可能在效率上有差別。
(六)
搞ACM需要的掌握的演算法.
要注意,ACM的競賽性強,因此自己應該和自己的實際應用聯絡起來.
適合自己的才是好的,有的人不適合搞演算法,喜歡系統架構,因此不要看到別人什麼就眼紅,
發揮自己的長處,這才是重要的.
第一階段:練經典常用演算法,下面的每個演算法給我打上十到二十遍,同時自己精簡程式碼,
因為太常用,所以要練到寫時不用想,10-15分鐘內打完,甚至關掉顯示器都可以把程式打
出來.
1.最短路(Floyd、Dijstra,BellmanFord)
2.最小生成樹(先寫個prim,kruscal要用並查集,不好寫)
3.大數(高精度)加減乘除
4.二分查詢. (程式碼可在五行以內)
5.叉乘、判線段相交、然後寫個凸包.
6.BFS、DFS,同時熟練hash表(要熟,要靈活,程式碼要簡)
7.數學上的有:輾轉相除(兩行內),線段交點、多角形面積公式.
8. 呼叫系統的qsort, 技巧很多,慢慢掌握.
9. 任意進位制間的轉換
第二階段:練習複雜一點,但也較常用的演算法。
如:
1. 二分圖匹配(匈牙利),最小路徑覆蓋
2. 網路流,最小費用流。
3. 線段樹.
4. 並查集。
5. 熟悉動態規劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp
6.博弈類演算法。博弈樹,二進位制法等。
7.最大團,最大獨立集。
8.判斷點在多邊形內。
9. 差分約束系統.
10. 雙向廣度搜索、A*演算法,最小耗散優先.
相關的知識
圖論
路徑問題
0/1邊權最短路徑
BFS
非負邊權最短路徑(Dijkstra)
可以用Dijkstra解決問題的特徵
負邊權最短路徑
Bellman-Ford
Bellman-Ford的Yen-氏優化
差分約束系統
Floyd
廣義路徑問題
傳遞閉包
極小極大距離 / 極大極小距離
Euler Path / Tour
圈套圈演算法
混合圖的 Euler Path / Tour
Hamilton Path / Tour
特殊圖的Hamilton Path / Tour 構造
生成樹問題
最小生成樹
第k小生成樹
最優比率生成樹
0/1分數規劃
度限制生成樹
連通性問題
強大的DFS演算法
無向圖連通性
割點
割邊
二連通分支
有向圖連通性
強連通分支
2-SAT
最小點基
有向無環圖
拓撲排序
有向無環圖與動態規劃的關係
二分圖匹配問題
一般圖問題與二分圖問題的轉換思路
最大匹配
有向圖的最小路徑覆蓋
0 / 1矩陣的最小覆蓋
完備匹配
最優匹配
穩定婚姻
網路流問題
網路流模型的簡單特徵和與線性規劃的關係
最大流最小割定理
最大流問題
有上下界的最大流問題
迴圈流
最小費用最大流 / 最大費用最大流
弦圖的性質和判定
組合數學
解決組合數學問題時常用的思想
逼近
遞推 / 動態規劃
概率問題
Polya定理
計算幾何 / 解析幾何
計算幾何的核心:叉積 / 面積
解析幾何的主力:複數
基本形
點
直線,線段
多邊形
凸多邊形 / 凸包
凸包演算法的引進,捲包裹法
Graham掃描法
水平序的引進,共線凸包的補丁
完美凸包演算法
相關判定
兩直線相交
兩線段相交
點在任意多邊形內的判定
點在凸多邊形內的判定
經典問題
最小外接圓
近似O(n)的最小外接圓演算法
點集直徑
旋轉卡殼,對踵點
多邊形的三角剖分
數學 / 數論
最大公約數
Euclid演算法
擴充套件的Euclid演算法
同餘方程 / 二元一次不定方程
同餘方程組
線性方程組
高斯消元法
解mod 2域上的線性方程組
整係數方程組的精確解法
矩陣
行列式的計算
利用矩陣乘法快速計算遞推關係
分數
分數樹
連分數逼近
數論計算
求N的約數個數
求phi(N)
求約數和
快速數論變換
……
素數問題
概率判素演算法
概率因子分解
資料結構
組織結構
二叉堆
左偏樹
二項樹
勝者樹
跳躍表
樣式圖示
斜堆
reap
統計結構
樹狀陣列
虛二叉樹
線段樹
矩形面積並
圓形面積並
關係結構
Hash表
並查集
路徑壓縮思想的應用
STL中的資料結構
vector
deque
set / map
動態規劃 / 記憶化搜尋
動態規劃和記憶化搜尋在思考方式上的區別
最長子序列系列問題
最長不下降子序列
最長公共子序列
最長公共不下降子序列
一類NP問題的動態規劃解法
樹型動態規劃
揹包問題
動態規劃的優化
四邊形不等式
函式的凸凹性
狀態設計
規劃方向
線性規劃
常用思想
二分 最小表示法
串
KMP Trie結構
字尾樹/字尾陣列 LCA/RMQ
有限狀態自動機理論
排序
選擇/冒泡 快速排序 堆排序 歸併排序
基數排序 拓撲排序 排序網路
中級:
一.基本演算法:
(1)C++的標準模版庫的應用. (poj3096,poj3007)
(2)較為複雜的模擬題的訓練(poj3393,poj1472,poj3371,poj1027,poj2706)
二.圖演算法:
(1)差分約束系統的建立和求解. (poj1201,poj2983)
(2)最小費用最大流(poj2516,poj2516,poj2195)
(3)雙連通分量(poj2942)
(4)強連通分支及其縮點.(poj2186)
(5)圖的割邊和割點(poj3352)
(6)最小割模型、網路流規約(poj3308, )
三.資料結構.
(1)線段樹. (poj2528,poj2828,poj2777,poj2886,poj2750)
(2)靜態二叉檢索樹. (poj2482,poj2352)
(3)樹狀樹組(poj1195,poj3321)
(4)RMQ. (poj3264,poj3368)
(5)並查集的高階應用. (poj1703,2492)
(6)KMP演算法. (poj1961,poj2406)
四.搜尋
(1)最優化剪枝和可行性剪枝
(2)搜尋的技巧和優化 (poj3411,poj1724)
(3)記憶化搜尋(poj3373,poj1691)
五.動態規劃
(1)較為複雜的動態規劃(如動態規劃解特別的施行商問題等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
(2)記錄狀態的動態規劃. (POJ3254,poj2411,poj1185)
(3)樹型動態規劃(poj2057,poj1947,poj2486,poj3140)
六.數學
(1)組合數學:
1.容斥原理.
2.抽屜原理.
3.置換群與Polya定理(poj1286,poj2409,poj3270,poj1026).
4.遞推關係和母函式.
(2)數學.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
2.概率問題. (poj3071,poj3440)
3.GCD、擴充套件的歐幾里德(中國剩餘定理) (poj3101)
(3)計算方法.
1.0/1分數規劃. (poj2976)
2.三分法求解單峰(單谷)的極值.
3.矩陣法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
(4)隨機化演算法(poj3318,poj2454)
(5)雜題.
(poj1870,poj3296,poj3286,poj1095)
七.計算幾何學.
(1)座標離散化.
(2)掃描線演算法(例如求矩形的面積和周長並,常和線段樹或堆一起使用).
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
(3)多邊形的核心(半平面交)(poj3130,poj3335)
(4)幾何工具的綜合應用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)
高階:
一.基本演算法要求:
(1)程式碼快速寫成,精簡但不失風格
(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)
(2)保證正確性和高效性. poj3434
二.圖演算法:
(1)度限制最小生成樹和第K最短路. (poj1639)
(2)最短路,最小生成樹,二分圖,最大流問題的相關理論(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
(3)最優比率生成樹. (poj2728)
(4)最小樹形圖(poj3164)
(5)次小生成樹.
(6)無向圖、有向圖的最小環
三.資料結構.
(1)trie圖的建立和應用. (poj2778)
(2)LCA和RMQ問題(LCA(最近公共祖先問題) 有離線演算法(並查集+dfs) 和 線上演算法
(RMQ+dfs)).(poj1330)
(3)雙端佇列和它的應用(維護一個單調的佇列,常常在動態規劃中起到優化狀態轉移的
目的). (poj2823)
(4)左偏樹(可合併堆).
(5)字尾樹(非常有用的資料結構,也是賽區考題的熱點).
(poj3415,poj3294)
四.搜尋
(1)較麻煩的搜尋題目訓練(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
(2)廣搜的狀態優化:利用M進位制數儲存狀態、轉化為串用hash表判重、按位壓縮儲存狀態、雙向廣搜、A*演算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)
(3)深搜的優化:儘量用位運算、一定要加剪枝、函式引數儘可能少、層數不易過大、可以考慮雙向搜尋或者是輪換搜尋、IDA*演算法. (poj3131,poj2870,poj2286)
五.動態規劃
(1)需要用資料結構優化的動態規劃.
(poj2754,poj3378,poj3017)
(2)四邊形不等式理論.
(3)較難的狀態DP(poj3133)
六.數學
(1)組合數學.
1.MoBius反演(poj2888,poj2154)
2.偏序關係理論.
(2)博奕論.
1.極大極小過程(poj3317,poj1085)
2.Nim問題.
七.計算幾何學.
(1)半平面求交(poj3384,poj2540)
(2)可檢視的建立(poj2966)
(3)點集最小圓覆蓋.
(4)對踵點(poj2079)
八.綜合題.
(poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj3315,poj2148,poj1263)
初期:
一.基本演算法:
(1)列舉. (poj1753,poj2965) (2)貪心(poj1328,poj2109,poj2586)
(3)遞迴和分治法. (4)遞推.
(5)構造法.(poj3295) (6)模擬法.(poj1068,poj2632,poj1573,poj2993,poj2996)
二.圖演算法:
(1)圖的深度優先遍歷和廣度優先遍歷.
(2)最短路徑演算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
(3)最小生成樹演算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
(4)拓撲排序 (poj1094)
(5)二分圖的最大匹配 (匈牙利演算法) (poj3041,poj3020)
(6)最大流的增廣路演算法(KM演算法). (poj1459,poj3436)
三.資料結構.
(1)串 (poj1035,poj3080,poj1936)
(2)排序(快排、歸併排(與逆序數有關)、堆排) (poj2388,poj2299)
(3)簡單並查集的應用.
(4)雜湊表和二分查詢等高效查詢法(數的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
(5)哈夫曼樹(poj3253)
(6)堆
(7)trie樹(靜態建樹、動態建樹) (poj2513)
四.簡單搜尋
(1)深度優先搜尋 (poj2488,poj3083,poj3009,poj1321,poj2251)
(2)廣度優先搜尋(poj3278,poj1426,poj3126,poj3087.poj3414)
(3)簡單搜尋技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.動態規劃
(1)揹包問題. (poj1837,poj1276)
(2)型如下表的簡單DP(可參考lrj的書 page149):
1.E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最長公共子序列)
(poj3176,poj1080,poj1159)
3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最優二分檢索樹問題)
六.數學
(1)組合數學:
1.加法原理和乘法原理.
2.排列組合.
3.遞推關係.
(POJ3252,poj1850,poj1019,poj1942)
(2)數論.
1.素數與整除問題
2.進位制位.
3.同餘模運算.
(poj2635, poj3292,poj1845,poj2115)
(3)計算方法.
1.二分法求解單調函式相關知識.(poj3273,poj3258,poj1905,poj3122)
七.計算幾何學.
(1)幾何公式.
(2)叉積和點積的運用(如線段相交的判定,點到線段的距離等). (poj2031,poj1039)
(3)多邊型的簡單演算法(求面積)和相關判定(點在多邊型內,多邊型是否相交)
(poj1408,poj1584)
(4)凸包. (poj2187,poj1113)
(七)
第一階段:練經典常用演算法,下面的每個演算法給我打上十到二十遍,同時自己精簡程式碼,
因為太常用,所以要練到寫時不用想,10-15分鐘內打完,甚至關掉顯示器都可以把程式打
出來.
1.最短路(Floyd、Dijstra,BellmanFord)
2.最小生成樹(先寫個prim,kruscal要用並查集,不好寫)
3.大數(高精度)加減乘除
4.二分查詢. (程式碼可在五行以內)
5.叉乘、判線段相交、然後寫個凸包.
6.BFS、DFS,同時熟練hash表(要熟,要靈活,程式碼要簡)
7.數學上的有:輾轉相除(兩行內),線段交點、多角形面積公式.
8. 呼叫系統的qsort, 技巧很多,慢慢掌握.
9. 任意進位制間的轉換
第二階段:練習複雜一點,但也較常用的演算法。
如:
1. 二分圖匹配(匈牙利),最小路徑覆蓋
2. 網路流,最小費用流。
3. 線段樹.
4. 並查集。
5. 熟悉動態規劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp
6.博弈類演算法。博弈樹,二進位制法等。
7.最大團,最大獨立集。
8.判斷點在多邊形內。
9. 差分約束系統.
10. 雙向廣度搜索、A*演算法,最小耗散優先.
(八)
搞實際專案的話基本用不著多少。lss說的那點都已經多了。當然,偶個人覺得,判斷一個問題是否NPC/NPH還是比較有用的,判是以後就不會把自己的經歷浪費在尋找多項式演算法上了。這點acm要用,實際專案偶覺得也有用。
acm的話上面貼的那一長串還不夠用。所謂不夠用,第一,指這些就算都會都不會寫錯,不會建立dp模型不會建立圖論模型的話一樣能掛得很慘,這種活的東西不是死做題就能會的。第二,這表還不全。既然圖可以扯到最優比率生成樹,那博弈的話至少也得扯SG定理,串的話至少也得扯AC自動機(吐槽:不是自動AC機),
(九)補充中。。。。
浙江大學 http://acm.zju.edu.cn 北京大學 http://acm.pku.edu.cn/JudgeOnline
天津大學 http://acm.tju.edu.cn 廈門大學 http://acm.xmu.edu.cn/JudgeOnline
福州大學 http://acm.fzu.edu.cn 華中科技 http://acm.hust.edu.cn/JudgeOnline
寧波理工 http://acm.nit.net.cn 合肥工大 http://acm.tdzl.net:83/JudgeOnline
汕頭大學 http://acm.stu.edu.cn 北大內部 http://ai.pku.cn/JudgeOnline
中國科大 http://acm.ustc.edu.cn 暨南大學 http://202.116.24.78/JudgeOnline
浙江工業 http://acm.zjut.edu.cn 中山大學 http://202.116.77.69/sicily
福建師範 http://acm.fjnu.edu.cn 哈工業大 http://acm.hit.edu.cn/ojs/ojs.php
杭電科大 http://acm.hziee.edu.cn 四川大學 http://acm.scu.edu.cn/soj
哈工程大 http://acm.hrbeu.edu.cn 武漢大學 http://acm.whu.edu.cn/noah
同濟大學 http://acm.tongji.edu.cn 湖南大學 http://acm.hnu.cn:8080/online/?
上海大學 http://pc.shu.edu.cn/openjudge/problemlist.php
蘭州大學 http://acm.sundayclub.cn/JudgeOnline/problemlist
OJ上的一些水題(可用來練手和增加自信)
(poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)
初期:
一.基本演算法:
(1)列舉. (poj1753,poj2965)
(2)貪心(poj1328,poj2109,poj2586)
(3)遞迴和分治法.
(4)遞推.
(5)構造法.(poj3295)
(6)模擬法.(poj1068,poj2632,poj1573,poj2993,poj2996)
二.圖演算法:
(1)圖的深度優先遍歷和廣度優先遍歷.
(2)最短路徑演算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
(3)最小生成樹演算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
(4)拓撲排序 (poj1094)
(5)二分圖的最大匹配 (匈牙利演算法) (poj3041,poj3020)
(6)最大流的增廣路演算法(KM演算法). (poj1459,poj3436)
三.資料結構.
(1)串 (poj1035,poj3080,poj1936)
(2)排序(快排、歸併排(與逆序數有關)、堆排) (poj2388,poj2299)
(3)簡單並查集的應用.
(4)雜湊表和二分查詢等高效查詢法(數的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
(5)哈夫曼樹(poj3253)
(6)堆
(7)trie樹(靜態建樹、動態建樹) (poj2513)
四.簡單搜尋
(1)深度優先搜尋 (poj2488,poj3083,poj3009,poj1321,poj2251)
(2)廣度優先搜尋(poj3278,poj1426,poj3126,poj3087.poj3414)
(3)簡單搜尋技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.動態規劃
(1)揹包問題. (poj1837,poj1276)
(2)型如下表的簡單DP(可參考lrj的書 page149):
1.E[j]=opt{D[i]+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最長公共子序列)
(poj3176,poj1080,poj1159)
3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最優二分檢索樹問題)
六.數學
(1)組合數學:
1.加法原理和乘法原理.
2.排列組合.
3.遞推關係.
(POJ3252,poj1850,poj1019,poj1942)
(2)數論.
1.素數與整除問題
2.進位制位.
3.同餘模運算.
(poj2635, poj3292,poj1845,poj2115)
(3)計算方法.
1.二分法求解單調函式相關知識.(poj3273,poj3258,poj1905,poj3122)
七.計算幾何學.
(1)幾何公式.
(2)叉積和點積的運用(如線段相交的判定,點到線段的距離等). (poj2031,poj1039)
(3)多邊型的簡單演算法(求面積)和相關判定(點在多邊型內,多邊型是否相交)
(poj1408,poj1584)
(4)凸包. (poj2187,poj1113)
中級:
一.基本演算法:
(1)C++的標準模版庫的應用. (poj3096,poj3007)
(2)較為複雜的模擬題的訓練(poj3393,poj1472,poj3371,poj1027,poj2706)
二.圖演算法:
(1)差分約束系統的建立和求解. (poj1201,poj2983)
(2)最小費用最大流(poj2516,poj2516,poj2195)
(3)雙連通分量(poj2942)
(4)強連通分支及其縮點.(poj2186)
(5)圖的割邊和割點(poj3352)
(6)最小割模型、網路流規約(poj3308, )
三.資料結構.
(1)線段樹. (poj2528,poj2828,poj2777,poj2886,poj2750)
(2)靜態二叉檢索樹. (poj2482,poj2352)
(3)樹狀樹組(poj1195,poj3321)
(4)RMQ. (poj3264,poj3368)
(5)並查集的高階應用. (poj1703,2492)
(6)KMP演算法. (poj1961,poj2406)
四.搜尋
(1)最優化剪枝和可行性剪枝
(2)搜尋的技巧和優化 (poj3411,poj1724)
(3)記憶化搜尋(poj3373,poj1691)
五.動態規劃
(1)較為複雜的動態規劃(如動態規劃解特別的施行商問題等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
(2)記錄狀態的動態規劃. (POJ3254,poj2411,poj1185)
(3)樹型動態規劃(poj2057,poj1947,poj2486,poj3140)
六.數學
(1)組合數學:
1.容斥原理.
2.抽屜原理.
3.置換群與Polya定理(poj1286,poj2409,poj3270,poj1026).
4.遞推關係和母函式.
(2)數學.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
2.概率問題. (poj3071,poj3440)
3.GCD、擴充套件的歐幾里德(中國剩餘定理) (poj3101)
(3)計算方法.
1.0/1分數規劃. (poj2976)
2.三分法求解單峰(單谷)的極值.
3.矩陣法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
(4)隨機化演算法(poj3318,poj2454)
(5)雜題.
(poj1870,poj3296,poj3286,poj1095)
七.計算幾何學.
(1)座標離散化.
(2)掃描線演算法(例如求矩形的面積和周長並,常和線段樹或堆一起使用).
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
(3)多邊形的核心(半平面交)(poj3130,poj3335)
(4)幾何工具的綜合應用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)
高階:
一.基本演算法要求:
(1)程式碼快速寫成,精簡但不失風格
(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)
(2)保證正確性和高效性. poj3434
二.圖演算法:
(1)度限制最小生成樹和第K最短路. (poj1639)
(2)最短路,最小生成樹,二分圖,最大流問題的相關理論(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
(3)最優比率生成樹. (poj2728)
(4)最小樹形圖(poj3164)
(5)次小生成樹.
(6)無向圖、有向圖的最小環
三.資料結構.
(1)trie圖的建立和應用. (poj2778)
(2)LCA和RMQ問題(LCA(最近公共祖先問題) 有離線演算法(並查集+dfs) 和 線上演算法
(RMQ+dfs)).(poj1330)
(3)雙端佇列和它的應用(維護一個單調的佇列,常常在動態規劃中起到優化狀態轉移的
目的). (poj2823)
(4)左偏樹(可合併堆).
(5)字尾樹(非常有用的資料結構,也是賽區考題的熱點).
(poj3415,poj3294)
四.搜尋
(1)較麻煩的搜尋題目訓練(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
(2)廣搜的狀態優化:利用M進位制數儲存狀態、轉化為串用hash表判重、按位壓縮儲存狀態、雙向廣搜、A*演算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)
(3)深搜的優化:儘量用位運算、一定要加剪枝、函式引數儘可能少、層數不易過大、可以考慮雙向搜尋或者是輪換搜尋、IDA*演算法. (poj3131,poj2870,poj2286)
五.動態規劃
(1)需要用資料結構優化的動態規劃.
(poj2754,poj3378,poj3017)
(2)四邊形不等式理論.
(3)較難的狀態DP(poj3133)
六.數學
(1)組合數學.
1.MoBius反演(poj2888,poj2154)
2.偏序關係理論.
(2)博奕論.
1.極大極小過程(poj3317,poj1085)
2.Nim問題.
七.計算幾何學.
(1)半平面求交(poj3384,poj2540)
(2)可檢視的建立(poj2966)
(3)點集最小圓覆蓋.
(4)對踵點(poj2079)
八.綜合題.
(poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj3315,poj2148,poj1263)
同時由於個人練習的時候可能有些偏向性,可能上面的總結不是很全,還請大家提出和指正,而且由於ACM的題目中專門針對某個演算法的題目可能比較少出現,所以上面的分類中的題有可能有多種解法或者是一些演算法的綜合,這都不會影響大家做題,希望練習的同學能夠認真,紮實地訓練,做到真正的理解演算法,掌握演算法.同時在論壇上還有許多前輩的分類,總結,大家也可以按自己的情況採用.注意FTP上有很多的資料,希望大家好好地利用.
如果同學能在明年暑假前能掌握上面大部分演算法,那你也基本上達到了訓練的目的,到暑假的時候你就可以選擇自己比較喜歡的方面進行加深和強化,而且同學們不要覺得看演算法的證明是很麻煩的事,這可以加強你的思維能力,這在ACM中也很重要.同時也希望老隊員能幫助我整理習題和題目分類.同時ACM的題目是沒有範圍的,只能在平時中多積累多練習,多比別人多努力一點,你就會比別人多一線希望.
我補充些動態規劃、搜尋方面的資料吧。
Dp狀態設計與方程總結
1.不完全狀態記錄
<1>青蛙過河問題
<2>利用區間dp
2.揹包類問題
<1> 0-1揹包,經典問題
<2>無限揹包,經典問題
<3>判定性揹包問題
<4>帶附屬關係的揹包問題
<5> + -1揹包問題
<6>雙揹包求最優值
<7>構造三角形問題
<8>帶上下界限制的揹包問題(012揹包)
3.線性的動態規劃問題
<1>積木遊戲問題
<2>決鬥(判定性問題)
<3>圓的最大多邊形問題
<4>統計單詞個數問題
<5>棋盤分割
<6>日程安排問題
<7>最小逼近問題(求出兩數之比最接近某數/兩數之和等於某數等等)
<8>方塊消除遊戲(某區間可以連續消去求最大效益)
<9>資源分配問題
<10>數字三角形問題
<11>漂亮的列印
<12>郵局問題與構造答案
<13>最高積木問題
<14>兩段連續和最大
<15>2次冪和問題
<16>N個數的最大M段子段和
<17>交叉最大數問題
4.判定性問題的dp(如判定整除、判定可達性等)
<1>模K問題的dp
<2>特殊的模K問題,求最大(最小)模K的數
<3>變換數問題
5.單調性優化的動態規劃
<1>1-SUM問題
<2>2-SUM問題
<3>序列劃分問題(單調佇列優化)
6.剖分問題(多邊形剖分/石子合併/圓的剖分/乘積最大)
<1>凸多邊形的三角剖分問題
<2>乘積最大問題
<3>多邊形遊戲(多邊形邊上是操作符,頂點有權值)
<4>石子合併(N^3/N^2/NLogN各種優化)
7.貪心的動態規劃
<1>最優裝載問題
<2>部分揹包問題
<3>乘船問題
<4>貪心策略
<5>雙機排程問題Johnson演算法
8.狀態dp
<1>牛仔射擊問題(博弈類)
<2>哈密頓路徑的狀態dp
<3>兩支點天平平衡問題
<4>一個有向圖的最接近二部圖
9.樹型dp
<1>完美伺服器問題(每個節點有3種狀態)
<2>小胖守皇宮問題
<3>網路收費問題
<4>樹中漫遊問題
<5>樹上的博弈
<6>樹的最大獨立集問題
<7>樹的最大平衡值問題
<8>構造樹的最小環
先掌握搜尋,動態規劃,貪心這些思想方法
然後學習各種技巧
ACM基本演算法分類
ACM基本演算法分類、推薦學習資料和配套pku習題一.動態規劃
參考資料:
劉汝佳《演算法藝術與資訊學競賽》《演算法導論》
推薦題目:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1141
簡單
http://acm.pku.edu.cn/JudgeOnline/problem?id=2288
中等,經典TSP問題
http://acm.pku.edu.cn/JudgeOnline/problem?id=2411
中等,狀態壓縮DP
http://acm.pku.edu.cn/JudgeOnline/problem?id=1112
中等
http://acm.pku.edu.cn/JudgeOnline/problem?id=1848
中等,樹形DP。可參考《演算法藝術與資訊學競賽》動態規劃一節的樹狀模型
http://acm.zju.edu.cn/show_problem.php?pid=1234
中等,《演算法藝術與資訊學競賽》中的習題
http://acm.pku.edu.cn/JudgeOnline/problem?id=1947
中等,《演算法藝術與資訊學競賽》中的習題
http://acm.pku.edu.cn/JudgeOnline/problem?id=1946
中等,《演算法藝術與資訊學競賽》中的習題
http://acm.pku.edu.cn/JudgeOnline/problem?id=1737
中等,遞推
http://acm.pku.edu.cn/JudgeOnline/problem?id=1821
中等,需要減少冗餘計算
http://acm.zju.edu.cn/show_problem.php?pid=2561
中等,四邊形不等式的簡單應用
http://acm.pku.edu.cn/JudgeOnline/problem?id=1038
較難,狀態壓縮DP,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=1390
較難,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=3017
較難,需要配合資料結構優化(我的題目^_^)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1682
較難,寫起來比較麻煩
http://acm.pku.edu.cn/JudgeOnline/problem?id=2047
較難
http://acm.pku.edu.cn/JudgeOnline/problem?id=2152
難,樹形DP
http://acm.pku.edu.cn/JudgeOnline/problem?id=3028
難,狀態壓縮DP,題目很有意思
http://acm.pku.edu.cn/JudgeOnline/problem?id=3124
難
http://acm.pku.edu.cn/JudgeOnline/problem?id=2915
非常難
二.搜尋
參考資料:
劉汝佳《演算法藝術與資訊學競賽》
推薦題目:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1011
簡單,深搜入門題
http://acm.pku.edu.cn/JudgeOnline/problem?id=1324
中等,廣搜
http://acm.pku.edu.cn/JudgeOnline/problem?id=2044
中等,廣搜
http://acm.pku.edu.cn/JudgeOnline/problem?id=2286
較難,廣搜
http://acm.pku.edu.cn/JudgeOnline/problem?id=1945
難,IDA*,迭代加深搜尋,需要較好的啟發函式
http://acm.pku.edu.cn/JudgeOnline/problem?id=2449
難,可重複K最短路,A*。可參考解題報告:
http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1144
http://acm.pku.edu.cn/JudgeOnline/problem?id=1190
難,深搜剪枝,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=1084
難,《演算法藝術與資訊學競賽》習題
http://acm.pku.edu.cn/JudgeOnline/problem?id=2989
難,深搜
http://acm.pku.edu.cn/JudgeOnline/problem?id=1167
較難,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=1069
很難
三. 常用資料結構
參考資料:
劉汝佳《演算法藝術與資訊學競賽》
《演算法導論》
線段樹資料:
http://home.ustc.edu.cn/~zhuhcheng/ACM/segment_tree.pdf
樹狀陣列資料
http://home.ustc.edu.cn/~zhuhcheng/ACM/tree.ppt
關於線段樹和樹狀陣列更多相關內容可在網上搜到
字尾陣列資料
http://home.ustc.edu.cn/~zhuhcheng/ACM/suffix_array.pdf
http://home.ustc.edu.cn/~zhuhcheng/ACM/linear_suffix.pdf
推薦題目
http://acm.pku.edu.cn/JudgeOnline/problem?id=2482
較難,線段樹應用,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=1151
簡單,線段樹應用矩形面積並,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=3225
較難,線段樹應用,可參考解題報告
http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1233
http://acm.pku.edu.cn/JudgeOnline/problem?id=2155
難,二維樹狀陣列。
http://acm.pku.edu.cn/JudgeOnline/problem?id=2777
中等,線段樹應用。
http://acm.pku.edu.cn/JudgeOnline/problem?id=2274
難,堆的應用,《演算法藝術與資訊學競賽》中有解答
http://acm.zju.edu.cn/show_problem.php?pid=2334
中等,左偏樹,二項式堆或其他可合併堆的應用。
左偏樹參考 http://www.nist.gov/dads/HTML/leftisttree.html
二項式堆參見《演算法導論》相關章節
http://acm.pku.edu.cn/JudgeOnline/problem?id=1182
中等,並查集
http://acm.pku.edu.cn/JudgeOnline/problem?id=1816
中等,字典樹
http://acm.pku.edu.cn/JudgeOnline/problem?id=2778
較難,多串匹配樹
參考: http://home.ustc.edu.cn/~zhuhcheng/ACM/zzy2004.pdf
http://acm.pku.edu.cn/JudgeOnline/problem?id=1743
難,字尾陣列
http://acm.pku.edu.cn/JudgeOnline/problem?id=2774
較難,最長公共子串,經典問題,字尾陣列
http://acm.pku.edu.cn/JudgeOnline/problem?id=2758
很難,字尾陣列
可參考解題報告
http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1178
http://acm.pku.edu.cn/JudgeOnline/problem?id=2448
很難,資料結構綜合運用
四.圖論基礎
參考資料:
劉汝佳《演算法藝術與資訊學競賽》《演算法導論》《網路演算法與複雜性理論》謝政
推薦題目:
http://acm.pku.edu.cn/JudgeOnline/problem?id=2337
簡單,尤拉路
http://acm.pku.edu.cn/JudgeOnline/problem?id=3177
中等,無向圖割邊
http://acm.pku.edu.cn/JudgeOnline/problem?id=2942
較難,無向圖雙連通分支
http://acm.pku.edu.cn/JudgeOnline/problem?id=1639
中等,最小度限制生成樹,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=2728
中等,最小比率生成樹,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=3013
簡單,最短路問題
http://acm.pku.edu.cn/JudgeOnline/problem?id=1275
中等,差分約束系統,Bellman-Ford求解,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=1252
簡單,Bellman-Ford
http://acm.pku.edu.cn/JudgeOnline/problem?id=1459
中等,網路流
http://acm.pku.edu.cn/JudgeOnline/problem?id=2391
較難,網路流
http://acm.pku.edu.cn/JudgeOnline/problem?id=1325
中等,二部圖最大匹配
http://acm.pku.edu.cn/JudgeOnline/problem?id=2226
較難,二部圖最大匹配
http://acm.pku.edu.cn/JudgeOnline/problem?id=2195
中等,二部圖最大權匹配
KM演算法參考《網路演算法與複雜性理論》
http://acm.pku.edu.cn/JudgeOnline/problem?id=2516
較難,二部圖最大權匹配
http://acm.pku.edu.cn/JudgeOnline/problem?id=1986
中等,LCA(最近公共祖先)問題
參考Tarjan's LCA algorithm 《演算法導論》第21章習題
http://acm.pku.edu.cn/JudgeOnline/problem?id=2723
較難,2-SAT問題
參考:http://home.ustc.edu.cn/~zhuhcheng/ACM/2-SAT.PPT
http://acm.pku.edu.cn/JudgeOnline/problem?id=2749
較難,2-SAT問題
http://acm.pku.edu.cn/JudgeOnline/problem?id=3164
較難,最小樹形圖
參考《網路演算法與複雜性理論》中朱-劉演算法
五.數論及組合計數基礎
http://acm.pku.edu.cn/JudgeOnline/problem?id=1811
簡單,素數判定,大數分解
參考演算法導論相關章節
http://acm.pku.edu.cn/JudgeOnline/problem?id=2888
較難,Burnside引理
http://acm.pku.edu.cn/JudgeOnline/problem?id=2891
中等,解模方程組
http://acm.pku.edu.cn/JudgeOnline/problem?id=2154
中等,經典問題,波利亞定理
http://cs.scu.edu.cn/soj/problem.action?id=2703
難,極好的題目,Burnside引理+模線性方程組
http://acm.pku.edu.cn/JudgeOnline/problem?id=2764
較難,需要數學方法,該方法在《具體數學》第七章有講
http://acm.pku.edu.cn/JudgeOnline/problem?id=1977
簡單,矩陣快速乘法
第01篇 ACM/ICPC競賽之基礎篇
一、ACM/ICPC競賽的特點
ACM/ICPC(國際大學生程式設計競賽)是以演算法設計為主的程式設計競賽,並不涉及具體的應用技術。
ACM/ICPC競賽以組隊形式參賽,每個參賽隊由三名隊員組成,共同使用一臺計算機解題。通常每場比賽的試題為6至10題,根據各隊的完成題數和罰時進行排名。題目提交通過稱為完成,從比賽開始到提交成功所用的時間為題目的基礎罰時,另外,一道題目每提交失敗一次,將增加20分鐘罰時。也就是說,參賽隊要儘可能用最快的速度、最少的失敗次數,解決最多的題目。
二、輸入和輸出處理
試題一般採用標準輸入和輸出方式讀取輸入和產生輸出,在題目中會詳細描述輸入和輸出的格式和值域範圍,所寫的程式一定要嚴格遵守題目指定的輸入輸出格式。
在比賽試題的輸入和輸出處理上,針對一些常見的情形,有一些常用的方法。
1、多測試用例的輸入和輸出
有些試題在一次輸入中只包含一個測試用例,也就是說,程式每執行一次,只算一道題。也有些試題在一次輸入中包含多個測試用例,也就是說,程式每執行一次,要計算多道題。
對多用例輸入,通常會先輸入要計算的用例的個數,然後依次輸入每個測試用例的輸入資料,但程式並不需要等到所有的測試用例都計算完後再輸出所有測試用例的計算結果,而是可以讀入一個測試用例,輸出一個結果,再讀入一個測試用例,再輸出一個結果。因此對多用例輸入的試題,可以用這樣的輸入模式:
以C++為例:
int n;
cin >> n;
for (int i=0; i<n; i++)
{
讀入測試用例資料
計算
輸出計算結果
}
2、單測試用例輸入的結束判斷
對單用例輸入,最主要的問題是如何知道輸入什麼時候結束。
有些試題會指定某種特殊的輸入值作為輸入的結束標誌,這種情況比較容易處理,只須在讀入後,判斷一下讀入的內容是否為約定結束值即可。
有些試題並不指定特殊的輸入值,而是以EOF(檔案結束標誌)作為結束標誌。如果從檔案流讀入,當讀到檔案尾時,輸入返回EOF。如果從鍵盤讀入時,在Windows的終端中,是以Ctrl+Z表示EOF。對於這種情況,可以用這樣的輸入模式:
以C++為例:
int m, n; // 假設要連續輸入一組整數對
while (cin>>m>>n)
{
處理整數對(m, n)
}
以C語言為例:
int m, n;
while (scanf("%d%d", &m, &n)==2)
{
處理整數對(m, n)
}
三、資料結構的設計
很多試題中已經給出了資料量的上限,因此可以很方便地以陣列的方式定義資料結構。但也要注意到有些題目中沒有明確指出資料上限時,切不可盲目定義陣列大小。
例如在題1070(多項式求和)中,並未說明輸入多項式的項數,對這種情況就不宜用陣列方式來表示多項式了——除非你的運氣足夠好,所開闢的陣列大小能夠經受所有的測試用例的考驗。
除了使用一般的陣列或連結串列結構外,對使用C++的選手來說,STL也是一大利器,充分運用可以有效提高程式設計的效率和正確性。
四、測試用例的考慮
在試題中通常會給出測試用例的樣例,這通常會被我們用來測試自己的程式,而且很多選手往往在正確計算出測試用例樣例時,會認為自己的程式是正確的。
其實測試用例的樣例只是測試用例的個例,實際用於測試的測試用例往往會涵蓋各種極限情況和邊界情況,而且有時測試用例的數量還會比較大,甚至會重複測試同一個測試用例。因此我們的程式能夠通過樣例測試,未必能夠通過所有的測試用例的測試,一方面要全面考慮所有可能的極限情況和邊界情況,一方面程式要有足夠的效率。
2008-7-17 01:29 回覆
狂暈的迷戰士
14位粉絲
2樓
第03篇 ACM/ICPC競賽之STL--pair
STL的<utility>標頭檔案中描述了一個看上去非常簡單的模板類pair,用來表示一個二元組或元素對,並提供了按照字典序對元素對進行大小比較的比較運算子模板函式。
例如,想要定義一個物件表示一個平面座標點,則可以:
pair<double, double> p1;
cin >> p1.first >> p1.second;
pair模板類需要兩個引數:首元素的資料型別和尾元素的資料型別。pair模板類物件有兩個成員:first和second,分別表示首元素和尾元素。
在<utility>中已經定義了pair上的六個比較運算子:<、>、<=、>=、==、!=,其規則是先比較first,first相等時再比較second,這符合大多數應用的邏輯。
當然,也可以通過過載這幾個運算子來重新指定自己的比較邏輯。
除了直接定義一個pair物件外,如果需要即時生成一個pair物件,也可以呼叫在<utility>中定義的一個模板函式:make_pair。make_pair需要兩個引數,
分別為元素對的首元素和尾元素。
在題1067--Ugly Numbers中,就可以用pair來表示推演樹上的結點,用first表示結點的值,用second表示結點是由父結點乘以哪一個因子得到的。
#include <iostream>
#include <queue>
using namespace std;
typedef pair<unsigned long, int> node_type;
main()
{ unsigned long result[1500];
priority_queue< node_type, vector<node_type>, greater<node_type> > Q;
Q.push( make_pair(1, 2) );
for (int i=0; i<1500; i++)
{
node_type node = Q.top();
Q.pop();
switch(node.second)
{ case 2: Q.push( make_pair(node.first*2, 2) );
case 3: Q.push( make_pair(node.first*3, 3) );
case 5: Q.push( make_pair(node.first*5, 5) );
}
result[i] = node.first;
}
int n; cin >> n;
while (n>0)
{
cout << result[n-1] << endl;
cin >> n;
}
return 1;
}
<utility>看上去是很簡單的一個頭檔案,但是<utility>的設計中卻濃縮反映了STL設計的基本思想。有意深入瞭解和研究STL的同學,仔細閱讀和體會這個簡單的標頭檔案,
不失為一種入門的途徑。
2008-7-17 01:31 回覆
狂暈的迷戰士
14位粉絲
3樓
第04篇 ACM/ICPC競賽之STL--vector
在STL的<vector>標頭檔案中定義了vector(向量容器模板類),vector容器以連續陣列的方式儲存元素序列,可以將vector看作是以順序結構實現的線性表。
當我們在程式中需要使用動態陣列時,vector將會是理想的選擇,vector可以在使用過程中動態地增長儲存空間。
vector模板類需要兩個模板引數,第一個引數是儲存元素的資料型別,第二個引數是儲存分配器的型別,其中第二個引數是可選的,如果不給出第二個引數,
將使用預設的分配器。
下面給出幾個常用的定義vector向量物件的方法示例:
vector<int> s;
定義一個空的vector物件,儲存的是int型別的元素。
vector<int> s(n);
定義一個含有n個int元素的vector物件。
vector<int> s(first, last);
定義一個vector物件,並從由迭代器first和last定義的序列[first, last)中複製初值。
vector的基本操作有:
s[i]
直接以下標方式訪問容器中的元素。
s.front()
返回首元素。
s.back()
返回尾元素。
s.push_back(x)
向表尾插入元素x。
s.size()
返回表長。
s.empty()
當表空時,返回真,否則返回假。
s.pop_back()
刪除表尾元素。
s.begin()
返回指向首元素的隨機存取迭代器。
s.end()
返回指向尾元素的下一個位置的隨機存取迭代器。
s.insert(it, x)
向迭代器it指向的元素前插入新元素val。
s.insert(it, n, x)
向迭代器it指向的元素前插入n個x。
s.insert(it, first, last)
將由迭代器first和last所指定的序列[first, last)插入到迭代器it指向的元素前面。
s.erase(it)
刪除由迭代器it所指向的元
ACM大量習題題庫
現在網上有許多題庫,大多是可以線上評測,所以叫做Online Judge。除了USACO是為IOI準備外,其餘幾乎全部是大學的ACM競賽題庫。
USACO
http://ace.delos.com/usacogate
美國著名線上題庫,專門為資訊學競賽選手準備
TJU
http://acm.tongji.edu.cn/
同濟大學線上題庫,唯一的中文題庫,適合NOIP選手
ZJU
http://acm.zju.edu.cn/
浙江大學線上題庫
JLU
http://acm.jlu.edu.cn/
吉林大學線上題庫(一直上不去)
PKU
http://acm.pku.edu.cn
北京大學線上題庫
URAL
http://acm.timus.ru
俄羅斯烏拉爾大學線上題庫
SGU
http://acm.sgu.ru/
俄羅斯聖薩拉托夫州大學線上題庫
ELJ
http://acm.mipt.ru/judge/bin/problems.pl?lang=en
俄羅斯莫斯科物理技術學院
SPOJ
https://spoj.sphere.pl/
波蘭格但斯克理工大學
UVA
http://acm.uva.es/
西班牙的Universidad de Valladolid線上題
ACM聯絡建議
一位高手對我的建議:
一般要做到50行以內的程式不用除錯、100行以內的二分鐘內除錯成功.acm主要是考演算法的
,主要時間是花在思考演算法上,不是花在寫程式與debug上。
下面給個計劃你練練:
第一階段:
練經典常用演算法,下面的每個演算法給我打上十到二十遍,同時自己精簡程式碼,
因為太常用,所以要練到寫時不用想,10-15分鐘內打完,甚至關掉顯示器都可以把程式打
出來.
1.最短路(Floyd、Dijstra,BellmanFord)
2.最小生成樹(先寫個prim,kruscal要用並查集,不好寫)
3.大數(高精度)加減乘除
4.二分查詢. (程式碼可在五行以內)
5.叉乘、判線段相交、然後寫個凸包.
6.BFS、DFS,同時熟練hash表(要熟,要靈活,程式碼要簡)
7.數學上的有:輾轉相除(兩行內),線段交點、多角形面積公式.
8. 呼叫系統的qsort, 技巧很多,慢慢掌握.
9. 任意進位制間的轉換
第二階段:
練習複雜一點,但也較常用的演算法。
如:
1. 二分圖匹配(匈牙利),最小路徑覆蓋
2. 網路流,最小費用流。
3. 線段樹.
4. 並查集。
5. 熟悉動態規劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp
6.博弈類演算法。博弈樹,二進位制法等。
7.最大團,最大獨立集。
8.判斷點在多邊形內。
9. 差分約束系統.
10. 雙向廣度搜索、A*演算法,最小耗散優先.
第三階段:
前兩個階段是打基礎,第三階段是鍛鍊在比賽中可以快速建立模型、想新演算法
。這就要平時多做做綜合的題型了。
1. 把oibh上的論文看看(大概幾百篇的,我只看了一點點,呵呵)。
2. 平時掃掃zoj上的難題啦,別老做那些不用想的題.(中大acm的版主經常說我挑簡單的來
做:-P )
3. 多參加網上的比賽,感受一下比賽的氣氛,評估自己的實力.
4. 一道題不要過了就算,問一下人,有更好的演算法也打一下。
5. 做過的題要記好 :-)
ACM ICPC學習計劃
大牛給的計劃——
一般要做到50行以內的程式不用除錯、100行以內的二分鐘內除錯成功.acm主要是考演算法的,主要時間是花在思考演算法上,不是花在寫程式與debug上。
下面給個計劃你練練:
第一階段:練經典常用演算法,下面的每個演算法給我打上十到二十遍,同時自己精簡程式碼,
因為太常用,所以要練到寫時不用想,10-15分鐘內打完,甚至關掉顯示器都可以把程式打
出來.
1.最短路(Floyd、Dijstra,BellmanFord)
2.最小生成樹(先寫個prim,kruscal要用並查集,不好寫)
3.大數(高精度)加減乘除
4.二分查詢. (程式碼可在五行以內)
5.叉乘、判線段相交、然後寫個凸包.
6.BFS、DFS,同時熟練hash表(要熟,要靈活,程式碼要簡)
7.數學上的有:輾轉相除(兩行內),線段交點、多角形面積公式.
8. 呼叫系統的qsort, 技巧很多,慢慢掌握.
9. 任意進位制間的轉換
第二階段:練習複雜一點,但也較常用的演算法。
如:
1. 二分圖匹配(匈牙利),最小路徑覆蓋
2. 網路流,最小費用流。
3. 線段樹.
4. 並查集。
5. 熟悉動態規劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp
6.博弈類演算法。博弈樹,二進位制法等。
7.最大團,最大獨立集。
8.判斷點在多邊形內。
9. 差分約束系統.
10. 雙向廣度搜索、A*演算法,最小耗散優先.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ACMer必備知識(這麼多呀,慢慢學了……
圖論
路徑問題
0/1邊權最短路徑
BFS
非負邊權最短路徑(Dijkstra)
可以用Dijkstra解決問題的特徵
負邊權最短路徑
Bellman-Ford
Bellman-Ford的Yen-氏優化
差分約束系統
Floyd
廣義路徑問題
傳遞閉包
極小極大距離 / 極大極小距離
Euler Path / Tour
圈套圈演算法
混合圖的 Euler Path / Tour
Hamilton Path / Tour
特殊圖的Hamilton Path / Tour 構造
生成樹問題
最小生成樹
第k小生成樹
最優比率生成樹
0/1分數規劃
度限制生成樹
連通性問題
強大的DFS演算法
無向圖連通性
割點
割邊
二連通分支
有向圖連通性
強連通分支
2-SAT
最小點基
有向無環圖
拓撲排序
有向無環圖與動態規劃的關係
二分圖匹配問題
一般圖問題與二分圖問題的轉換思路
最大匹配
有向圖的最小路徑覆蓋
0 / 1矩陣的最小覆蓋
完備匹配
最優匹配
穩定婚姻
網路流問題
網路流模型的簡單特徵和與線性規劃的關係
最大流最小割定理
最大流問題
有上下界的最大流問題
迴圈流
最小費用最大流 / 最大費用最大流
弦圖的性質和判定
組合數學
解決組合數學問題時常用的思想
逼近
遞推 / 動態規劃
概率問題
Polya定理
計算幾何 / 解析幾何
計算幾何的核心:叉積 / 面積
解析幾何的主力:複數
基本形
點
直線,線段
多邊形
凸多邊形 / 凸包
凸包演算法的引進,捲包裹法
Graham掃描法
水平序的引進,共線凸包的補丁
完美凸包演算法
相關判定
兩直線相交
兩線段相交
點在任意多邊形內的判定
點在凸多邊形內的判定
經典問題
最小外接圓
近似O(n)的最小外接圓演算法
點集直徑
旋轉卡殼,對踵點
多邊形的三角剖分
數學 / 數論
最大公約數
Euclid演算法
擴充套件的Euclid演算法
同餘方程 / 二元一次不定方程
同餘方程組
線性方程組
高斯消元法
解mod 2域上的線性方程組
整係數方程組的精確解法
矩陣
行列式的計算
利用矩陣乘法快速計算遞推關係
分數
分數樹
連分數逼近
數論計算
求N的約數個數
求phi(N)
求約數和
快速數論變換
……
素數問題
概率判素演算法
概率因子分解
資料結構
組織結構
二叉堆
左偏樹
二項樹
勝者樹
跳躍表
樣式圖示
斜堆
reap
統計結構
樹狀陣列
虛二叉樹
線段樹
矩形面積並
圓形面積並
關係結構
Hash表
並查集
路徑壓縮思想的應用
STL中的資料結構
vector
deque
set / map
動態規劃 / 記憶化搜尋
動態規劃和記憶化搜尋在思考方式上的區別
最長子序列系列問題
最長不下降子序列
最長公共子序列
最長公共不下降子序列
一類NP問題的動態規劃解法
樹型動態規劃
揹包問題
動態規劃的優化
四邊形不等式
函式的凸凹性
狀態設計
規劃方向
線性規劃
常用思想
二分
最小表示法
串
KMP
Trie結構
字尾樹/字尾陣列
LCA/RMQ
有限狀態自動機理論
排序
選擇/冒泡
快速排序
堆排序
歸併排序
基數排序
拓撲排序
排序網路
熟練掌握資料結構、常用演算法匯聚
(一)
不可能都完全記住那麼多的演算法.
常用演算法,拿過來就可以寫出來
不常用的,拿起書來,看10分鐘,就能理解演算法(因為以前記過).
對以前沒有記過的演算法,就不好說了,難的可能要研究好幾天.
這樣就可以了.
應該熟練掌握的常用的演算法應該有:
各種排序演算法(插入排序、氣泡排序、選擇排序,快速排序,堆排序,歸併排序)
線性表(一般的線性表,棧,佇列)的插入和刪除
二叉樹的遍歷(前序,中序,後序)
圖的遍歷(深度優先,廣度優先)
二分法查詢,排序二叉樹,Hash查詢(處理衝突的方法)。
(二)
分析一個東西,你可以用不同的眼光去看待,有很多時候,就跟自己生活一樣,覺得小時候看待問題很幼稚,現在看問題全面了,而且方式不一樣了,為什麼,就是成長吧,就跟這個一樣的,你對演算法,比如寫一個程式,可能直接寫很簡單,可是可以有一些有趣的方式,比如通過什麼樣來表達,怎麼樣更高效..等等吧
(三)
於大學裡把基本的專業課學紮實就ok,如:資料結構,離散,作業系統等。碰到一些基本的資料結構和演算法,如查詢排序要根據原理馬上能寫出相應的程式碼就行了,我個人是這樣理解的,對於更深層次的東西,也是建立在自己熟練的基礎之上的吧
(四)
演算法與資料結構考驗試題精析》第2版 機械工業出版社
如果你想練習的話,這裡有N多的題可以來練習,但實際中能用到的比較少,除非搞一些高階的玩意,不過平時也可以在自己的專案中結合使用
(五)
資料結構在平時可能用不上,但資料結構可以培養你程式時如果注意效率的意識,一個學過資料結構的人和一個沒有學過數結構的人寫出來的程式可能在效率上有差別。
(六)
搞ACM需要的掌握的演算法.
要注意,ACM的競賽性強,因此自己應該和自己的實際應用聯絡起來.
適合自己的才是好的,有的人不適合搞演算法,喜歡系統架構,因此不要看到別人什麼就眼紅,
發揮自己的長處,這才是重要的.
第一階段:練經典常用演算法,下面的每個演算法給我打上十到二十遍,同時自己精簡程式碼,
因為太常用,所以要練到寫時不用想,10-15分鐘內打完,甚至關掉顯示器都可以把程式打
出來.
1.最短路(Floyd、Dijstra,BellmanFord)
2.最小生成樹(先寫個prim,kruscal要用並查集,不好寫)
3.大數(高精度)加減乘除
4.二分查詢. (程式碼可在五行以內)
5.叉乘、判線段相交、然後寫個凸包.
6.BFS、DFS,同時熟練hash表(要熟,要靈活,程式碼要簡)
7.數學上的有:輾轉相除(兩行內),線段交點、多角形面積公式.
8. 呼叫系統的qsort, 技巧很多,慢慢掌握.
9. 任意進位制間的轉換
第二階段:練習複雜一點,但也較常用的演算法。
如:
1. 二分圖匹配(匈牙利),最小路徑覆蓋
2. 網路流,最小費用流。
3. 線段樹.
4. 並查集。
5. 熟悉動態規劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp
6.博弈類演算法。博弈樹,二進位制法等。
7.最大團,最大獨立集。
8.判斷點在多邊形內。
9. 差分約束系統.
10. 雙向廣度搜索、A*演算法,最小耗散優先.
相關的知識
圖論
路徑問題
0/1邊權最短路徑
BFS
非負邊權最短路徑(Dijkstra)
可以用Dijkstra解決問題的特徵
負邊權最短路徑
Bellman-Ford
Bellman-Ford的Yen-氏優化
差分約束系統
Floyd
廣義路徑問題
傳遞閉包
極小極大距離 / 極大極小距離
Euler Path / Tour
圈套圈演算法
混合圖的 Euler Path / Tour
Hamilton Path / Tour
特殊圖的Hamilton Path / Tour 構造
生成樹問題
最小生成樹
第k小生成樹
最優比率生成樹
0/1分數規劃
度限制生成樹
連通性問題
強大的DFS演算法
無向圖連通性
割點
割邊
二連通分支
有向圖連通性
強連通分支
2-SAT
最小點基
有向無環圖
拓撲排序
有向無環圖與動態規劃的關係
二分圖匹配問題
一般圖問題與二分圖問題的轉換思路
最大匹配
有向圖的最小路徑覆蓋
0 / 1矩陣的最小覆蓋
完備匹配
最優匹配
穩定婚姻
網路流問題
網路流模型的簡單特徵和與線性規劃的關係
最大流最小割定理
最大流問題
有上下界的最大流問題
迴圈流
最小費用最大流 / 最大費用最大流
弦圖的性質和判定
組合數學
解決組合數學問題時常用的思想
逼近
遞推 / 動態規劃
概率問題
Polya定理
計算幾何 / 解析幾何
計算幾何的核心:叉積 / 面積
解析幾何的主力:複數
基本形
點
直線,線段
多邊形
凸多邊形 / 凸包
凸包演算法的引進,捲包裹法
Graham掃描法
水平序的引進,共線凸包的補丁
完美凸包演算法
相關判定
兩直線相交
兩線段相交
點在任意多邊形內的判定
點在凸多邊形內的判定
經典問題
最小外接圓
近似O(n)的最小外接圓演算法
點集直徑
旋轉卡殼,對踵點
多邊形的三角剖分
數學 / 數論
最大公約數
Euclid演算法
擴充套件的Euclid演算法
同餘方程 / 二元一次不定方程
同餘方程組
線性方程組
高斯消元法
解mod 2域上的線性方程組
整係數方程組的精確解法
矩陣
行列式的計算
利用矩陣乘法快速計算遞推關係
分數
分數樹
連分數逼近
數論計算
求N的約數個數
求phi(N)
求約數和
快速數論變換
……
素數問題
概率判素演算法
概率因子分解
資料結構
組織結構
二叉堆
左偏樹
二項樹
勝者樹
跳躍表
樣式圖示
斜堆
reap
統計結構
樹狀陣列
虛二叉樹
線段樹
矩形面積並
圓形面積並
關係結構
Hash表
並查集
路徑壓縮思想的應用
STL中的資料結構
vector
deque
set / map
動態規劃 / 記憶化搜尋
動態規劃和記憶化搜尋在思考方式上的區別
最長子序列系列問題
最長不下降子序列
最長公共子序列
最長公共不下降子序列
一類NP問題的動態規劃解法
樹型動態規劃
揹包問題
動態規劃的優化
四邊形不等式
函式的凸凹性
狀態設計
規劃方向
線性規劃
常用思想
二分 最小表示法
串
KMP Trie結構
字尾樹/字尾陣列 LCA/RMQ
有限狀態自動機理論
排序
選擇/冒泡 快速排序 堆排序 歸併排序
基數排序 拓撲排序 排序網路
中級:
一.基本演算法:
(1)C++的標準模版庫的應用. (poj3096,poj3007)
(2)較為複雜的模擬題的訓練(poj3393,poj1472,poj3371,poj1027,poj2706)
二.圖演算法:
(1)差分約束系統的建立和求解. (poj1201,poj2983)
(2)最小費用最大流(poj2516,poj2516,poj2195)
(3)雙連通分量(poj2942)
(4)強連通分支及其縮點.(poj2186)
(5)圖的割邊和割點(poj3352)
(6)最小割模型、網路流規約(poj3308, )
三.資料結構.
(1)線段樹. (poj2528,poj2828,poj2777,poj2886,poj2750)
(2)靜態二叉檢索樹. (poj2482,poj2352)
(3)樹狀樹組(poj1195,poj3321)
(4)RMQ. (poj3264,poj3368)
(5)並查集的高階應用. (poj1703,2492)
(6)KMP演算法. (poj1961,poj2406)
四.搜尋
(1)最優化剪枝和可行性剪枝
(2)搜尋的技巧和優化 (poj3411,poj1724)
(3)記憶化搜尋(poj3373,poj1691)
五.動態規劃
(1)較為複雜的動態規劃(如動態規劃解特別的施行商問題等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
(2)記錄狀態的動態規劃. (POJ3254,poj2411,poj1185)
(3)樹型動態規劃(poj2057,poj1947,poj2486,poj3140)
六.數學
(1)組合數學:
1.容斥原理.
2.抽屜原理.
3.置換群與Polya定理(poj1286,poj2409,poj3270,poj1026).
4.遞推關係和母函式.
(2)數學.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
2.概率問題. (poj3071,poj3440)
3.GCD、擴充套件的歐幾里德(中國剩餘定理) (poj3101)
(3)計算方法.
1.0/1分數規劃. (poj2976)
2.三分法求解單峰(單谷)的極值.
3.矩陣法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
(4)隨機化演算法(poj3318,poj2454)
(5)雜題.
(poj1870,poj3296,poj3286,poj1095)
七.計算幾何學.
(1)座標離散化.
(2)掃描線演算法(例如求矩形的面積和周長並,常和線段樹或堆一起使用).
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
(3)多邊形的核心(半平面交)(poj3130,poj3335)
(4)幾何工具的綜合應用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)
高階:
一.基本演算法要求:
(1)程式碼快速寫成,精簡但不失風格
(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)
(2)保證正確性和高效性. poj3434
二.圖演算法:
(1)度限制最小生成樹和第K最短路. (poj1639)
(2)最短路,最小生成樹,二分圖,最大流問題的相關理論(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
(3)最優比率生成樹. (poj2728)
(4)最小樹形圖(poj3164)
(5)次小生成樹.
(6)無向圖、有向圖的最小環
三.資料結構.
(1)trie圖的建立和應用. (poj2778)
(2)LCA和RMQ問題(LCA(最近公共祖先問題) 有離線演算法(並查集+dfs) 和 線上演算法
(RMQ+dfs)).(poj1330)
(3)雙端佇列和它的應用(維護一個單調的佇列,常常在動態規劃中起到優化狀態轉移的
目的). (poj2823)
(4)左偏樹(可合併堆).
(5)字尾樹(非常有用的資料結構,也是賽區考題的熱點).
(poj3415,poj3294)
四.搜尋
(1)較麻煩的搜尋題目訓練(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
(2)廣搜的狀態優化:利用M進位制數儲存狀態、轉化為串用hash表判重、按位壓縮儲存狀態、雙向廣搜、A*演算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)
(3)深搜的優化:儘量用位運算、一定要加剪枝、函式引數儘可能少、層數不易過大、可以考慮雙向搜尋或者是輪換搜尋、IDA*演算法. (poj3131,poj2870,poj2286)
五.動態規劃
(1)需要用資料結構優化的動態規劃.
(poj2754,poj3378,poj3017)
(2)四邊形不等式理論.
(3)較難的狀態DP(poj3133)
六.數學
(1)組合數學.
1.MoBius反演(poj2888,poj2154)
2.偏序關係理論.
(2)博奕論.
1.極大極小過程(poj3317,poj1085)
2.Nim問題.
七.計算幾何學.
(1)半平面求交(poj3384,poj2540)
(2)可檢視的建立(poj2966)
(3)點集最小圓覆蓋.
(4)對踵點(poj2079)
八.綜合題.
(poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj3315,poj2148,poj1263)
初期:
一.基本演算法:
(1)列舉. (poj1753,poj2965) (2)貪心(poj1328,poj2109,poj2586)
(3)遞迴和分治法. (4)遞推.
(5)構造法.(poj3295) (6)模擬法.(poj1068,poj2632,poj1573,poj2993,poj2996)
二.圖演算法:
(1)圖的深度優先遍歷和廣度優先遍歷.
(2)最短路徑演算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
(3)最小生成樹演算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
(4)拓撲排序 (poj1094)
(5)二分圖的最大匹配 (匈牙利演算法) (poj3041,poj3020)
(6)最大流的增廣路演算法(KM演算法). (poj1459,poj3436)
三.資料結構.
(1)串 (poj1035,poj3080,poj1936)
(2)排序(快排、歸併排(與逆序數有關)、堆排) (poj2388,poj2299)
(3)簡單並查集的應用.
(4)雜湊表和二分查詢等高效查詢法(數的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
(5)哈夫曼樹(poj3253)
(6)堆
(7)trie樹(靜態建樹、動態建樹) (poj2513)
四.簡單搜尋
(1)深度優先搜尋 (poj2488,poj3083,poj3009,poj1321,poj2251)
(2)廣度優先搜尋(poj3278,poj1426,poj3126,poj3087.poj3414)
(3)簡單搜尋技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.動態規劃
(1)揹包問題. (poj1837,poj1276)
(2)型如下表的簡單DP(可參考lrj的書 page149):
1.E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最長公共子序列)
(poj3176,poj1080,poj1159)
3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最優二分檢索樹問題)
六.數學
(1)組合數學:
1.加法原理和乘法原理.
2.排列組合.
3.遞推關係.
(POJ3252,poj1850,poj1019,poj1942)
(2)數論.
1.素數與整除問題
2.進位制位.
3.同餘模運算.
(poj2635, poj3292,poj1845,poj2115)
(3)計算方法.
1.二分法求解單調函式相關知識.(poj3273,poj3258,poj1905,poj3122)
七.計算幾何學.
(1)幾何公式.
(2)叉積和點積的運用(如線段相交的判定,點到線段的距離等). (poj2031,poj1039)
(3)多邊型的簡單演算法(求面積)和相關判定(點在多邊型內,多邊型是否相交)
(poj1408,poj1584)
(4)凸包. (poj2187,poj1113)
(七)
第一階段:練經典常用演算法,下面的每個演算法給我打上十到二十遍,同時自己精簡程式碼,
因為太常用,所以要練到寫時不用想,10-15分鐘內打完,甚至關掉顯示器都可以把程式打
出來.
1.最短路(Floyd、Dijstra,BellmanFord)
2.最小生成樹(先寫個prim,kruscal要用並查集,不好寫)
3.大數(高精度)加減乘除
4.二分查詢. (程式碼可在五行以內)
5.叉乘、判線段相交、然後寫個凸包.
6.BFS、DFS,同時熟練hash表(要熟,要靈活,程式碼要簡)
7.數學上的有:輾轉相除(兩行內),線段交點、多角形面積公式.
8. 呼叫系統的qsort, 技巧很多,慢慢掌握.
9. 任意進位制間的轉換
第二階段:練習複雜一點,但也較常用的演算法。
如:
1. 二分圖匹配(匈牙利),最小路徑覆蓋
2. 網路流,最小費用流。
3. 線段樹.
4. 並查集。
5. 熟悉動態規劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp
6.博弈類演算法。博弈樹,二進位制法等。
7.最大團,最大獨立集。
8.判斷點在多邊形內。
9. 差分約束系統.
10. 雙向廣度搜索、A*演算法,最小耗散優先.
(八)
搞實際專案的話基本用不著多少。lss說的那點都已經多了。當然,偶個人覺得,判斷一個問題是否NPC/NPH還是比較有用的,判是以後就不會把自己的經歷浪費在尋找多項式演算法上了。這點acm要用,實際專案偶覺得也有用。
acm的話上面貼的那一長串還不夠用。所謂不夠用,第一,指這些就算都會都不會寫錯,不會建立dp模型不會建立圖論模型的話一樣能掛得很慘,這種活的東西不是死做題就能會的。第二,這表還不全。既然圖可以扯到最優比率生成樹,那博弈的話至少也得扯SG定理,串的話至少也得扯AC自動機(吐槽:不是自動AC機),
(九)補充中。。。。
浙江大學 http://acm.zju.edu.cn 北京大學 http://acm.pku.edu.cn/JudgeOnline
天津大學 http://acm.tju.edu.cn 廈門大學 http://acm.xmu.edu.cn/JudgeOnline
福州大學 http://acm.fzu.edu.cn 華中科技 http://acm.hust.edu.cn/JudgeOnline
寧波理工 http://acm.nit.net.cn 合肥工大 http://acm.tdzl.net:83/JudgeOnline
汕頭大學 http://acm.stu.edu.cn 北大內部 http://ai.pku.cn/JudgeOnline
中國科大 http://acm.ustc.edu.cn 暨南大學 http://202.116.24.78/JudgeOnline
浙江工業 http://acm.zjut.edu.cn 中山大學 http://202.116.77.69/sicily
福建師範 http://acm.fjnu.edu.cn 哈工業大 http://acm.hit.edu.cn/ojs/ojs.php
杭電科大 http://acm.hziee.edu.cn 四川大學 http://acm.scu.edu.cn/soj
哈工程大 http://acm.hrbeu.edu.cn 武漢大學 http://acm.whu.edu.cn/noah
同濟大學 http://acm.tongji.edu.cn 湖南大學 http://acm.hnu.cn:8080/online/?
上海大學 http://pc.shu.edu.cn/openjudge/problemlist.php
蘭州大學 http://acm.sundayclub.cn/JudgeOnline/problemlist
OJ上的一些水題(可用來練手和增加自信)
(poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)
初期:
一.基本演算法:
(1)列舉. (poj1753,poj2965)
(2)貪心(poj1328,poj2109,poj2586)
(3)遞迴和分治法.
(4)遞推.
(5)構造法.(poj3295)
(6)模擬法.(poj1068,poj2632,poj1573,poj2993,poj2996)
二.圖演算法:
(1)圖的深度優先遍歷和廣度優先遍歷.
(2)最短路徑演算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
(3)最小生成樹演算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
(4)拓撲排序 (poj1094)
(5)二分圖的最大匹配 (匈牙利演算法) (poj3041,poj3020)
(6)最大流的增廣路演算法(KM演算法). (poj1459,poj3436)
三.資料結構.
(1)串 (poj1035,poj3080,poj1936)
(2)排序(快排、歸併排(與逆序數有關)、堆排) (poj2388,poj2299)
(3)簡單並查集的應用.
(4)雜湊表和二分查詢等高效查詢法(數的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
(5)哈夫曼樹(poj3253)
(6)堆
(7)trie樹(靜態建樹、動態建樹) (poj2513)
四.簡單搜尋
(1)深度優先搜尋 (poj2488,poj3083,poj3009,poj1321,poj2251)
(2)廣度優先搜尋(poj3278,poj1426,poj3126,poj3087.poj3414)
(3)簡單搜尋技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.動態規劃
(1)揹包問題. (poj1837,poj1276)
(2)型如下表的簡單DP(可參考lrj的書 page149):
1.E[j]=opt{D[i]+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最長公共子序列)
(poj3176,poj1080,poj1159)
3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最優二分檢索樹問題)
六.數學
(1)組合數學:
1.加法原理和乘法原理.
2.排列組合.
3.遞推關係.
(POJ3252,poj1850,poj1019,poj1942)
(2)數論.
1.素數與整除問題
2.進位制位.
3.同餘模運算.
(poj2635, poj3292,poj1845,poj2115)
(3)計算方法.
1.二分法求解單調函式相關知識.(poj3273,poj3258,poj1905,poj3122)
七.計算幾何學.
(1)幾何公式.
(2)叉積和點積的運用(如線段相交的判定,點到線段的距離等). (poj2031,poj1039)
(3)多邊型的簡單演算法(求面積)和相關判定(點在多邊型內,多邊型是否相交)
(poj1408,poj1584)
(4)凸包. (poj2187,poj1113)
中級:
一.基本演算法:
(1)C++的標準模版庫的應用. (poj3096,poj3007)
(2)較為複雜的模擬題的訓練(poj3393,poj1472,poj3371,poj1027,poj2706)
二.圖演算法:
(1)差分約束系統的建立和求解. (poj1201,poj2983)
(2)最小費用最大流(poj2516,poj2516,poj2195)
(3)雙連通分量(poj2942)
(4)強連通分支及其縮點.(poj2186)
(5)圖的割邊和割點(poj3352)
(6)最小割模型、網路流規約(poj3308, )
三.資料結構.
(1)線段樹. (poj2528,poj2828,poj2777,poj2886,poj2750)
(2)靜態二叉檢索樹. (poj2482,poj2352)
(3)樹狀樹組(poj1195,poj3321)
(4)RMQ. (poj3264,poj3368)
(5)並查集的高階應用. (poj1703,2492)
(6)KMP演算法. (poj1961,poj2406)
四.搜尋
(1)最優化剪枝和可行性剪枝
(2)搜尋的技巧和優化 (poj3411,poj1724)
(3)記憶化搜尋(poj3373,poj1691)
五.動態規劃
(1)較為複雜的動態規劃(如動態規劃解特別的施行商問題等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
(2)記錄狀態的動態規劃. (POJ3254,poj2411,poj1185)
(3)樹型動態規劃(poj2057,poj1947,poj2486,poj3140)
六.數學
(1)組合數學:
1.容斥原理.
2.抽屜原理.
3.置換群與Polya定理(poj1286,poj2409,poj3270,poj1026).
4.遞推關係和母函式.
(2)數學.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
2.概率問題. (poj3071,poj3440)
3.GCD、擴充套件的歐幾里德(中國剩餘定理) (poj3101)
(3)計算方法.
1.0/1分數規劃. (poj2976)
2.三分法求解單峰(單谷)的極值.
3.矩陣法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
(4)隨機化演算法(poj3318,poj2454)
(5)雜題.
(poj1870,poj3296,poj3286,poj1095)
七.計算幾何學.
(1)座標離散化.
(2)掃描線演算法(例如求矩形的面積和周長並,常和線段樹或堆一起使用).
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
(3)多邊形的核心(半平面交)(poj3130,poj3335)
(4)幾何工具的綜合應用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)
高階:
一.基本演算法要求:
(1)程式碼快速寫成,精簡但不失風格
(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)
(2)保證正確性和高效性. poj3434
二.圖演算法:
(1)度限制最小生成樹和第K最短路. (poj1639)
(2)最短路,最小生成樹,二分圖,最大流問題的相關理論(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
(3)最優比率生成樹. (poj2728)
(4)最小樹形圖(poj3164)
(5)次小生成樹.
(6)無向圖、有向圖的最小環
三.資料結構.
(1)trie圖的建立和應用. (poj2778)
(2)LCA和RMQ問題(LCA(最近公共祖先問題) 有離線演算法(並查集+dfs) 和 線上演算法
(RMQ+dfs)).(poj1330)
(3)雙端佇列和它的應用(維護一個單調的佇列,常常在動態規劃中起到優化狀態轉移的
目的). (poj2823)
(4)左偏樹(可合併堆).
(5)字尾樹(非常有用的資料結構,也是賽區考題的熱點).
(poj3415,poj3294)
四.搜尋
(1)較麻煩的搜尋題目訓練(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
(2)廣搜的狀態優化:利用M進位制數儲存狀態、轉化為串用hash表判重、按位壓縮儲存狀態、雙向廣搜、A*演算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)
(3)深搜的優化:儘量用位運算、一定要加剪枝、函式引數儘可能少、層數不易過大、可以考慮雙向搜尋或者是輪換搜尋、IDA*演算法. (poj3131,poj2870,poj2286)
五.動態規劃
(1)需要用資料結構優化的動態規劃.
(poj2754,poj3378,poj3017)
(2)四邊形不等式理論.
(3)較難的狀態DP(poj3133)
六.數學
(1)組合數學.
1.MoBius反演(poj2888,poj2154)
2.偏序關係理論.
(2)博奕論.
1.極大極小過程(poj3317,poj1085)
2.Nim問題.
七.計算幾何學.
(1)半平面求交(poj3384,poj2540)
(2)可檢視的建立(poj2966)
(3)點集最小圓覆蓋.
(4)對踵點(poj2079)
八.綜合題.
(poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj3315,poj2148,poj1263)
同時由於個人練習的時候可能有些偏向性,可能上面的總結不是很全,還請大家提出和指正,而且由於ACM的題目中專門針對某個演算法的題目可能比較少出現,所以上面的分類中的題有可能有多種解法或者是一些演算法的綜合,這都不會影響大家做題,希望練習的同學能夠認真,紮實地訓練,做到真正的理解演算法,掌握演算法.同時在論壇上還有許多前輩的分類,總結,大家也可以按自己的情況採用.注意FTP上有很多的資料,希望大家好好地利用.
如果同學能在明年暑假前能掌握上面大部分演算法,那你也基本上達到了訓練的目的,到暑假的時候你就可以選擇自己比較喜歡的方面進行加深和強化,而且同學們不要覺得看演算法的證明是很麻煩的事,這可以加強你的思維能力,這在ACM中也很重要.同時也希望老隊員能幫助我整理習題和題目分類.同時ACM的題目是沒有範圍的,只能在平時中多積累多練習,多比別人多努力一點,你就會比別人多一線希望.
我補充些動態規劃、搜尋方面的資料吧。
Dp狀態設計與方程總結
1.不完全狀態記錄
<1>青蛙過河問題
<2>利用區間dp
2.揹包類問題
<1> 0-1揹包,經典問題
<2>無限揹包,經典問題
<3>判定性揹包問題
<4>帶附屬關係的揹包問題
<5> + -1揹包問題
<6>雙揹包求最優值
<7>構造三角形問題
<8>帶上下界限制的揹包問題(012揹包)
3.線性的動態規劃問題
<1>積木遊戲問題
<2>決鬥(判定性問題)
<3>圓的最大多邊形問題
<4>統計單詞個數問題
<5>棋盤分割
<6>日程安排問題
<7>最小逼近問題(求出兩數之比最接近某數/兩數之和等於某數等等)
<8>方塊消除遊戲(某區間可以連續消去求最大效益)
<9>資源分配問題
<10>數字三角形問題
<11>漂亮的列印
<12>郵局問題與構造答案
<13>最高積木問題
<14>兩段連續和最大
<15>2次冪和問題
<16>N個數的最大M段子段和
<17>交叉最大數問題
4.判定性問題的dp(如判定整除、判定可達性等)
<1>模K問題的dp
<2>特殊的模K問題,求最大(最小)模K的數
<3>變換數問題
5.單調性優化的動態規劃
<1>1-SUM問題
<2>2-SUM問題
<3>序列劃分問題(單調佇列優化)
6.剖分問題(多邊形剖分/石子合併/圓的剖分/乘積最大)
<1>凸多邊形的三角剖分問題
<2>乘積最大問題
<3>多邊形遊戲(多邊形邊上是操作符,頂點有權值)
<4>石子合併(N^3/N^2/NLogN各種優化)
7.貪心的動態規劃
<1>最優裝載問題
<2>部分揹包問題
<3>乘船問題
<4>貪心策略
<5>雙機排程問題Johnson演算法
8.狀態dp
<1>牛仔射擊問題(博弈類)
<2>哈密頓路徑的狀態dp
<3>兩支點天平平衡問題
<4>一個有向圖的最接近二部圖
9.樹型dp
<1>完美伺服器問題(每個節點有3種狀態)
<2>小胖守皇宮問題
<3>網路收費問題
<4>樹中漫遊問題
<5>樹上的博弈
<6>樹的最大獨立集問題
<7>樹的最大平衡值問題
<8>構造樹的最小環
先掌握搜尋,動態規劃,貪心這些思想方法
然後學習各種技巧
ACM基本演算法分類
ACM基本演算法分類、推薦學習資料和配套pku習題一.動態規劃
參考資料:
劉汝佳《演算法藝術與資訊學競賽》《演算法導論》
推薦題目:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1141
簡單
http://acm.pku.edu.cn/JudgeOnline/problem?id=2288
中等,經典TSP問題
http://acm.pku.edu.cn/JudgeOnline/problem?id=2411
中等,狀態壓縮DP
http://acm.pku.edu.cn/JudgeOnline/problem?id=1112
中等
http://acm.pku.edu.cn/JudgeOnline/problem?id=1848
中等,樹形DP。可參考《演算法藝術與資訊學競賽》動態規劃一節的樹狀模型
http://acm.zju.edu.cn/show_problem.php?pid=1234
中等,《演算法藝術與資訊學競賽》中的習題
http://acm.pku.edu.cn/JudgeOnline/problem?id=1947
中等,《演算法藝術與資訊學競賽》中的習題
http://acm.pku.edu.cn/JudgeOnline/problem?id=1946
中等,《演算法藝術與資訊學競賽》中的習題
http://acm.pku.edu.cn/JudgeOnline/problem?id=1737
中等,遞推
http://acm.pku.edu.cn/JudgeOnline/problem?id=1821
中等,需要減少冗餘計算
http://acm.zju.edu.cn/show_problem.php?pid=2561
中等,四邊形不等式的簡單應用
http://acm.pku.edu.cn/JudgeOnline/problem?id=1038
較難,狀態壓縮DP,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=1390
較難,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=3017
較難,需要配合資料結構優化(我的題目^_^)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1682
較難,寫起來比較麻煩
http://acm.pku.edu.cn/JudgeOnline/problem?id=2047
較難
http://acm.pku.edu.cn/JudgeOnline/problem?id=2152
難,樹形DP
http://acm.pku.edu.cn/JudgeOnline/problem?id=3028
難,狀態壓縮DP,題目很有意思
http://acm.pku.edu.cn/JudgeOnline/problem?id=3124
難
http://acm.pku.edu.cn/JudgeOnline/problem?id=2915
非常難
二.搜尋
參考資料:
劉汝佳《演算法藝術與資訊學競賽》
推薦題目:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1011
簡單,深搜入門題
http://acm.pku.edu.cn/JudgeOnline/problem?id=1324
中等,廣搜
http://acm.pku.edu.cn/JudgeOnline/problem?id=2044
中等,廣搜
http://acm.pku.edu.cn/JudgeOnline/problem?id=2286
較難,廣搜
http://acm.pku.edu.cn/JudgeOnline/problem?id=1945
難,IDA*,迭代加深搜尋,需要較好的啟發函式
http://acm.pku.edu.cn/JudgeOnline/problem?id=2449
難,可重複K最短路,A*。可參考解題報告:
http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1144
http://acm.pku.edu.cn/JudgeOnline/problem?id=1190
難,深搜剪枝,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=1084
難,《演算法藝術與資訊學競賽》習題
http://acm.pku.edu.cn/JudgeOnline/problem?id=2989
難,深搜
http://acm.pku.edu.cn/JudgeOnline/problem?id=1167
較難,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=1069
很難
三. 常用資料結構
參考資料:
劉汝佳《演算法藝術與資訊學競賽》
《演算法導論》
線段樹資料:
http://home.ustc.edu.cn/~zhuhcheng/ACM/segment_tree.pdf
樹狀陣列資料
http://home.ustc.edu.cn/~zhuhcheng/ACM/tree.ppt
關於線段樹和樹狀陣列更多相關內容可在網上搜到
字尾陣列資料
http://home.ustc.edu.cn/~zhuhcheng/ACM/suffix_array.pdf
http://home.ustc.edu.cn/~zhuhcheng/ACM/linear_suffix.pdf
推薦題目
http://acm.pku.edu.cn/JudgeOnline/problem?id=2482
較難,線段樹應用,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=1151
簡單,線段樹應用矩形面積並,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=3225
較難,線段樹應用,可參考解題報告
http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1233
http://acm.pku.edu.cn/JudgeOnline/problem?id=2155
難,二維樹狀陣列。
http://acm.pku.edu.cn/JudgeOnline/problem?id=2777
中等,線段樹應用。
http://acm.pku.edu.cn/JudgeOnline/problem?id=2274
難,堆的應用,《演算法藝術與資訊學競賽》中有解答
http://acm.zju.edu.cn/show_problem.php?pid=2334
中等,左偏樹,二項式堆或其他可合併堆的應用。
左偏樹參考 http://www.nist.gov/dads/HTML/leftisttree.html
二項式堆參見《演算法導論》相關章節
http://acm.pku.edu.cn/JudgeOnline/problem?id=1182
中等,並查集
http://acm.pku.edu.cn/JudgeOnline/problem?id=1816
中等,字典樹
http://acm.pku.edu.cn/JudgeOnline/problem?id=2778
較難,多串匹配樹
參考: http://home.ustc.edu.cn/~zhuhcheng/ACM/zzy2004.pdf
http://acm.pku.edu.cn/JudgeOnline/problem?id=1743
難,字尾陣列
http://acm.pku.edu.cn/JudgeOnline/problem?id=2774
較難,最長公共子串,經典問題,字尾陣列
http://acm.pku.edu.cn/JudgeOnline/problem?id=2758
很難,字尾陣列
可參考解題報告
http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1178
http://acm.pku.edu.cn/JudgeOnline/problem?id=2448
很難,資料結構綜合運用
四.圖論基礎
參考資料:
劉汝佳《演算法藝術與資訊學競賽》《演算法導論》《網路演算法與複雜性理論》謝政
推薦題目:
http://acm.pku.edu.cn/JudgeOnline/problem?id=2337
簡單,尤拉路
http://acm.pku.edu.cn/JudgeOnline/problem?id=3177
中等,無向圖割邊
http://acm.pku.edu.cn/JudgeOnline/problem?id=2942
較難,無向圖雙連通分支
http://acm.pku.edu.cn/JudgeOnline/problem?id=1639
中等,最小度限制生成樹,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=2728
中等,最小比率生成樹,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=3013
簡單,最短路問題
http://acm.pku.edu.cn/JudgeOnline/problem?id=1275
中等,差分約束系統,Bellman-Ford求解,《演算法藝術與資訊學競賽》中有解答
http://acm.pku.edu.cn/JudgeOnline/problem?id=1252
簡單,Bellman-Ford
http://acm.pku.edu.cn/JudgeOnline/problem?id=1459
中等,網路流
http://acm.pku.edu.cn/JudgeOnline/problem?id=2391
較難,網路流
http://acm.pku.edu.cn/JudgeOnline/problem?id=1325
中等,二部圖最大匹配
http://acm.pku.edu.cn/JudgeOnline/problem?id=2226
較難,二部圖最大匹配
http://acm.pku.edu.cn/JudgeOnline/problem?id=2195
中等,二部圖最大權匹配
KM演算法參考《網路演算法與複雜性理論》
http://acm.pku.edu.cn/JudgeOnline/problem?id=2516
較難,二部圖最大權匹配
http://acm.pku.edu.cn/JudgeOnline/problem?id=1986
中等,LCA(最近公共祖先)問題
參考Tarjan's LCA algorithm 《演算法導論》第21章習題
http://acm.pku.edu.cn/JudgeOnline/problem?id=2723
較難,2-SAT問題
參考:http://home.ustc.edu.cn/~zhuhcheng/ACM/2-SAT.PPT
http://acm.pku.edu.cn/JudgeOnline/problem?id=2749
較難,2-SAT問題
http://acm.pku.edu.cn/JudgeOnline/problem?id=3164
較難,最小樹形圖
參考《網路演算法與複雜性理論》中朱-劉演算法
五.數論及組合計數基礎
http://acm.pku.edu.cn/JudgeOnline/problem?id=1811
簡單,素數判定,大數分解
參考演算法導論相關章節
http://acm.pku.edu.cn/JudgeOnline/problem?id=2888
較難,Burnside引理
http://acm.pku.edu.cn/JudgeOnline/problem?id=2891
中等,解模方程組
http://acm.pku.edu.cn/JudgeOnline/problem?id=2154
中等,經典問題,波利亞定理
http://cs.scu.edu.cn/soj/problem.action?id=2703
難,極好的題目,Burnside引理+模線性方程組
http://acm.pku.edu.cn/JudgeOnline/problem?id=2764
較難,需要數學方法,該方法在《具體數學》第七章有講
http://acm.pku.edu.cn/JudgeOnline/problem?id=1977
簡單,矩陣快速乘法
第01篇 ACM/ICPC競賽之基礎篇
一、ACM/ICPC競賽的特點
ACM/ICPC(國際大學生程式設計競賽)是以演算法設計為主的程式設計競賽,並不涉及具體的應用技術。
ACM/ICPC競賽以組隊形式參賽,每個參賽隊由三名隊員組成,共同使用一臺計算機解題。通常每場比賽的試題為6至10題,根據各隊的完成題數和罰時進行排名。題目提交通過稱為完成,從比賽開始到提交成功所用的時間為題目的基礎罰時,另外,一道題目每提交失敗一次,將增加20分鐘罰時。也就是說,參賽隊要儘可能用最快的速度、最少的失敗次數,解決最多的題目。
二、輸入和輸出處理
試題一般採用標準輸入和輸出方式讀取輸入和產生輸出,在題目中會詳細描述輸入和輸出的格式和值域範圍,所寫的程式一定要嚴格遵守題目指定的輸入輸出格式。
在比賽試題的輸入和輸出處理上,針對一些常見的情形,有一些常用的方法。
1、多測試用例的輸入和輸出
有些試題在一次輸入中只包含一個測試用例,也就是說,程式每執行一次,只算一道題。也有些試題在一次輸入中包含多個測試用例,也就是說,程式每執行一次,要計算多道題。
對多用例輸入,通常會先輸入要計算的用例的個數,然後依次輸入每個測試用例的輸入資料,但程式並不需要等到所有的測試用例都計算完後再輸出所有測試用例的計算結果,而是可以讀入一個測試用例,輸出一個結果,再讀入一個測試用例,再輸出一個結果。因此對多用例輸入的試題,可以用這樣的輸入模式:
以C++為例:
int n;
cin >> n;
for (int i=0; i<n; i++)
{
讀入測試用例資料
計算
輸出計算結果
}
2、單測試用例輸入的結束判斷
對單用例輸入,最主要的問題是如何知道輸入什麼時候結束。
有些試題會指定某種特殊的輸入值作為輸入的結束標誌,這種情況比較容易處理,只須在讀入後,判斷一下讀入的內容是否為約定結束值即可。
有些試題並不指定特殊的輸入值,而是以EOF(檔案結束標誌)作為結束標誌。如果從檔案流讀入,當讀到檔案尾時,輸入返回EOF。如果從鍵盤讀入時,在Windows的終端中,是以Ctrl+Z表示EOF。對於這種情況,可以用這樣的輸入模式:
以C++為例:
int m, n; // 假設要連續輸入一組整數對
while (cin>>m>>n)
{
處理整數對(m, n)
}
以C語言為例:
int m, n;
while (scanf("%d%d", &m, &n)==2)
{
處理整數對(m, n)
}
三、資料結構的設計
很多試題中已經給出了資料量的上限,因此可以很方便地以陣列的方式定義資料結構。但也要注意到有些題目中沒有明確指出資料上限時,切不可盲目定義陣列大小。
例如在題1070(多項式求和)中,並未說明輸入多項式的項數,對這種情況就不宜用陣列方式來表示多項式了——除非你的運氣足夠好,所開闢的陣列大小能夠經受所有的測試用例的考驗。
除了使用一般的陣列或連結串列結構外,對使用C++的選手來說,STL也是一大利器,充分運用可以有效提高程式設計的效率和正確性。
四、測試用例的考慮
在試題中通常會給出測試用例的樣例,這通常會被我們用來測試自己的程式,而且很多選手往往在正確計算出測試用例樣例時,會認為自己的程式是正確的。
其實測試用例的樣例只是測試用例的個例,實際用於測試的測試用例往往會涵蓋各種極限情況和邊界情況,而且有時測試用例的數量還會比較大,甚至會重複測試同一個測試用例。因此我們的程式能夠通過樣例測試,未必能夠通過所有的測試用例的測試,一方面要全面考慮所有可能的極限情況和邊界情況,一方面程式要有足夠的效率。
2008-7-17 01:29 回覆
狂暈的迷戰士
14位粉絲
2樓
第03篇 ACM/ICPC競賽之STL--pair
STL的<utility>標頭檔案中描述了一個看上去非常簡單的模板類pair,用來表示一個二元組或元素對,並提供了按照字典序對元素對進行大小比較的比較運算子模板函式。
例如,想要定義一個物件表示一個平面座標點,則可以:
pair<double, double> p1;
cin >> p1.first >> p1.second;
pair模板類需要兩個引數:首元素的資料型別和尾元素的資料型別。pair模板類物件有兩個成員:first和second,分別表示首元素和尾元素。
在<utility>中已經定義了pair上的六個比較運算子:<、>、<=、>=、==、!=,其規則是先比較first,first相等時再比較second,這符合大多數應用的邏輯。
當然,也可以通過過載這幾個運算子來重新指定自己的比較邏輯。
除了直接定義一個pair物件外,如果需要即時生成一個pair物件,也可以呼叫在<utility>中定義的一個模板函式:make_pair。make_pair需要兩個引數,
分別為元素對的首元素和尾元素。
在題1067--Ugly Numbers中,就可以用pair來表示推演樹上的結點,用first表示結點的值,用second表示結點是由父結點乘以哪一個因子得到的。
#include <iostream>
#include <queue>
using namespace std;
typedef pair<unsigned long, int> node_type;
main()
{ unsigned long result[1500];
priority_queue< node_type, vector<node_type>, greater<node_type> > Q;
Q.push( make_pair(1, 2) );
for (int i=0; i<1500; i++)
{
node_type node = Q.top();
Q.pop();
switch(node.second)
{ case 2: Q.push( make_pair(node.first*2, 2) );
case 3: Q.push( make_pair(node.first*3, 3) );
case 5: Q.push( make_pair(node.first*5, 5) );
}
result[i] = node.first;
}
int n; cin >> n;
while (n>0)
{
cout << result[n-1] << endl;
cin >> n;
}
return 1;
}
<utility>看上去是很簡單的一個頭檔案,但是<utility>的設計中卻濃縮反映了STL設計的基本思想。有意深入瞭解和研究STL的同學,仔細閱讀和體會這個簡單的標頭檔案,
不失為一種入門的途徑。
2008-7-17 01:31 回覆
狂暈的迷戰士
14位粉絲
3樓
第04篇 ACM/ICPC競賽之STL--vector
在STL的<vector>標頭檔案中定義了vector(向量容器模板類),vector容器以連續陣列的方式儲存元素序列,可以將vector看作是以順序結構實現的線性表。
當我們在程式中需要使用動態陣列時,vector將會是理想的選擇,vector可以在使用過程中動態地增長儲存空間。
vector模板類需要兩個模板引數,第一個引數是儲存元素的資料型別,第二個引數是儲存分配器的型別,其中第二個引數是可選的,如果不給出第二個引數,
將使用預設的分配器。
下面給出幾個常用的定義vector向量物件的方法示例:
vector<int> s;
定義一個空的vector物件,儲存的是int型別的元素。
vector<int> s(n);
定義一個含有n個int元素的vector物件。
vector<int> s(first, last);
定義一個vector物件,並從由迭代器first和last定義的序列[first, last)中複製初值。
vector的基本操作有:
s[i]
直接以下標方式訪問容器中的元素。
s.front()
返回首元素。
s.back()
返回尾元素。
s.push_back(x)
向表尾插入元素x。
s.size()
返回表長。
s.empty()
當表空時,返回真,否則返回假。
s.pop_back()
刪除表尾元素。
s.begin()
返回指向首元素的隨機存取迭代器。
s.end()
返回指向尾元素的下一個位置的隨機存取迭代器。
s.insert(it, x)
向迭代器it指向的元素前插入新元素val。
s.insert(it, n, x)
向迭代器it指向的元素前插入n個x。
s.insert(it, first, last)
將由迭代器first和last所指定的序列[first, last)插入到迭代器it指向的元素前面。
s.erase(it)
刪除由迭代器it所指向的元