一般ACM或者笔试题的时间限制是1秒或2秒。 在这种情况下,C++代码中的操作次数控制在 $10^7$ 为最佳。
下面给出在不同数据范围下,代码的时间复杂度和算法改如何选择:
- $n\le 30$ : 指数级别,DFS + 剪枝,状态压缩dp;
- $n\le 100$ : $O(n^3)$, Floyd, dp;
- $n \le 1000$ : $O(n^2)$,$O(n^2logn)$,dp,二分;
- $n \le 10000$ : $O(n \sqrt(n))$, 块状链表;
- $n \le 100000$: $O(nlogn)$, 各种sort,线段树,树状数组,set/map,heap,dijkstra+heap,spfa,求凸包,求半平面交,二分;
- $n \le 1000000$ : $O(n)$ 以及常数较小的$O(nlogn)$算法,hash,双指针扫描,kmp,AC自动机,常数较小的$O(nlogn)$的做法:sort,树状数组,heap,dijkstra,spfa;
- $n\le 10000000$ : $O(n)$,双指针扫描,kmp,AC自动机,线性筛素数;
- $n\le 10^9$ : $O(\sqrt(n))$,判断质数;
- $n\le 10^{18}$ : $O(log(n))$,最大公约数,常用数论的方法推导。