#P0893. 时空复杂度分析

时空复杂度分析

一般题目的时间限制是 11秒。在这种情况下,C++ 代码中的操作次数尽量不要超过 10810^8

下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:

1. n30n≤30 dfs + 剪枝、数字排列、n皇后问题、八数码问题、状态压缩 dp、蒙德里安的梦想、最短Hamilton路径。

2. n100=>O(n3)n≤100 => O(n^3) floyd、dp。

3. n103=>O(n2)O(n2logn)n≤10^3=> O(n^2)、O(n^2logn) dp、二分、朴素版 Dijkstra、朴素版 Prim、Bellman-Ford。

4. n104=>O(nn)n≤10^4 => O(n\sqrt n) 块状链表、分块、莫队。

5. n105=>O(nlogn)n≤10^5 => O(nlogn) 各种 sort、线段树、树状数组、set/map、heap、dijkstra+heap、prim+heap、spfa、求凸包、求半平面交、二分。

6. n106=>O(n)n≤10^6=> O(n) 以及常数较小的 O(nlogn)O(nlogn)算法、hash、双指针扫描、并查集,kmp、AC 自动机、常数比较小的 O(nlogn)O(nlogn) 的做法:sort、树状数组、heap、dijkstra、spfa。

7. n107=>O(n)n≤10^7 => O(n) 双指针扫描、kmp、AC 自动机、线性筛素数。

8. n109=>O(nn)n≤10^9 => O(n\sqrt n) 判断质数。

9. n1018=>O(logn)n≤10^{18}=> O(logn) 最大公约数,快速幂。

10. n101000=>O((logn)2)n≤10^{1000}=> O((logn)^2) 高精度加减乘除。

11 n10100000=>O(logn×loglogn)n≤10^{100000} => O(logn×loglogn) 高精度加减、FFT/NTT。