解算法题步骤
题目描述→抽象出模型(应该用什么算法,保证正确性和时间不会超)
c++评测机一秒钟可以运行108次,所以要保证时间复杂度<107∼108
由数据范围反推算法复杂度以及算法内容
可以把210想象成103,那么23.3就等同于10
数据范围 |
算法复杂度 |
常见算法 |
n≤30 |
指数级别 |
dfs+剪枝、状态压缩dp |
n≤100 |
O(n3) |
floyd、dp、高斯消元 |
n≤1000 |
O(n2) or O(n2logn) |
dp、二分、朴素版Dijkstra、朴素版Prim、Bellman-Ford |
n≤10000 |
O(n∗n) |
块状链表、分块、莫队 |
n≤100000 |
O(nlogn) |
各种sort、线段树、树状数组、set/map、heap、拓扑排序、dijkstra+heap、prim+heap、Kruskal、spfa、求凸包、求半平面交、二分、CDQ分治、整体二分、后缀数组、树链剖分、动态树 |
n≤1000000 |
$ O(n)or常数较小的 O(nlogn) 算法$ |
单调队列、 hash、双指针扫描、并查集、kmp、AC自动机 常数比较小的 O(nlogn) 的做法:sort、树状数组、heap、dijkstra、spfa |
n≤10000000 |
O(n) |
双指针扫描、kmp、AC自动机、线性筛素数 |
n≤109 |
O(n) |
判断质数 |
n≤1018 |
O(logn) |
最大公约数、快速幂、数位DP |
n≤101000 |
O((logn)2) |
高精度加减乘除 |
n≤10100000 |
O(logk×loglogk),k表示位数 |
高精度加减、FFT/NTT |
变量范围
int:−2147483648∼2147483647,±2×109
long long:±1018