由資料範圍反推演算法複雜度以及演算法內容
一般ACM時間限制是1-2秒
這種情況下,c++程式碼操作次數控制在1e7~1e8
下面給出在不同資料範圍下,程式碼時間複雜度和演算法如何選擇
1.n<=30,指數級別,dfs+剪枝,狀態壓縮dp
2.n<=100 =>O(n3),floyd,dp,高斯消元
3.n<=1000=>O(n2),O(n2logn),dp,二分,樸素版Dijkstra,樸素版Prim、Bellman-Ford
4.n≤10000 =>O(n*根號n),塊狀連結串列、分塊、莫隊
5.n<=10000=>O(nlogn)=>各種sort,線段樹、樹狀陣列、set/map、heap、拓撲排序,dijkstra+heap、prim+heap、Kruskal、spfa、求凸包、求半平面交、二分、CDQ分治、整體二分、字尾陣列、樹鏈剖分、動態樹
6.n<=1000000=>O(n),以及常數較小的O(nlogn)演算法=>單調佇列、 hash、雙指標掃描、並查集,kmp、AC自動機,常數比較小的O(nlogn)演算法=>sort、樹狀陣列、heap、dijkstra、spfa
7.n<=10000000=>O(n),雙指標掃描,kmp,AC自動機、線性篩素數
8.n<=1e9=>O(根號n)判斷質數
9.n<=1e18=>O(logn),最大公約數,快速冪,數位DP
10.n<=1e1000=>O((logn)的平方),高精度加減乘除
11.n<=1e100000=>O(logk*loglogk),k表示位置,高精度加減,FFT/NIT