一般ACM或者笔试题的时间限制是 1 1 1秒或 2 2 2秒
C++一般 1 1 1s能计算 1 0 7 10^7 107~ 1 0 8 10^8 108次,在这种情况下,C++代码中的操作次数控制在 1 0 7 10^7 107为最佳
在不同数据范围下,代码的时间复杂度和算法的选择技巧如下:
n ≤ 30 n\le 30 n≤30,指数级别 dfs+剪枝状态压缩dp n ≤ 100 n \le 100 n≤100, O ( n 3 ) O(n^3) O(n3) floyddp n ≤ 1000 n \le 1000 n≤1000, O ( n 2 ) O(n^2) O(n2), O ( n 2 log n ) O(n^2 \log n) O(n2logn) dp二分朴素版Dijkstra朴素版PrimBellman-Ford n ≤ 10000 n \le 10000 n≤10000, O ( n n ) O(n\sqrt{n}) O(nn ) 块状链表分块莫队 n ≤ 1 0 5 n \le 10^5 n≤105, O ( n log n ) O(n\log n) O(nlogn) 各种排序算法线段树树状数组set/mapheap拓扑排序堆优化Dijkstra堆优化PrimSPFA求凸包求半平面交二分 n ≤ 1 0 6 n \le 10^6 n≤106 O ( n ) O(n) O(n) Hash双指针扫描并查集KMPAC自动机 常数较小的 O ( n log n ) O(n\log n) O(nlogn) 排序树状数组heapDijkstraSPFA n ≤ 1 0 7 n \le 10^7 n≤107, O ( n ) O(n) O(n) 双指针扫描KMPAC自动机线性筛素数 n ≤ 1 0 9 n \le 10^9 n≤109, O ( n ) O(\sqrt{n}) O(n ) 判断质数 n ≤ 1 0 18 n \le 10^{18} n≤1018, O ( log n ) O(\log n) O(logn) 最大公约数快速幂 n ≤ 1 0 1000 n \le 10^{1000} n≤101000, O ( ( log n ) 2 ) O((\log n)^2) O((logn)2) 高精度加减乘除 n ≤ 1 0 100000 n \le 10^{100000} n≤10100000, O ( log n × log log n ) O(\log n\times \log\log n) O(logn×loglogn) 高精度加减FFT/NTT小技巧
log 2 1 0 n = 3 n \log_2 10^n =3n log210n=3n64MB至多开1600万个intP.S. 部分内容来自y总的由数据范围反推算法复杂度以及算法内容 如果大家有兴趣,可以去Acwing《算法基础课》看看 我在Acwing也分享了一份,欢迎去围观