一般题目的时间限制是 1秒。在这种情况下,C++ 代码中的操作次数尽量不要超过 108。
下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:
1. n≤30 dfs + 剪枝、数字排列、n皇后问题、八数码问题、状态压缩 dp、蒙德里安的梦想、最短Hamilton路径。
2. n≤100=>O(n3) floyd、dp。
3. n≤103=>O(n2)、O(n2logn) dp、二分、朴素版 Dijkstra、朴素版 Prim、Bellman-Ford。
4. n≤104=>O(nn) 块状链表、分块、莫队。
5. n≤105=>O(nlogn) 各种 sort、线段树、树状数组、set/map、heap、dijkstra+heap、prim+heap、spfa、求凸包、求半平面交、二分。
6. n≤106=>O(n) 以及常数较小的 O(nlogn)算法、hash、双指针扫描、并查集,kmp、AC 自动机、常数比较小的 O(nlogn) 的做法:sort、树状数组、heap、dijkstra、spfa。
7. n≤107=>O(n) 双指针扫描、kmp、AC 自动机、线性筛素数。
8. n≤109=>O(nn) 判断质数。
9. n≤1018=>O(logn) 最大公约数,快速幂。
10. n≤101000=>O((logn)2) 高精度加减乘除。
11 n≤10100000=>O(logn×loglogn) 高精度加减、FFT/NTT。