1. 程式人生 > >ACM大量習題題庫及建議培養計劃

ACM大量習題題庫及建議培養計劃

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所指向的元