一般ACM或者笔试题的时间限制是1秒或2秒。在这种情况下,C++代码中的操作次数控制在
1
0
7
和
1
0
8
10^7和10^8
107和108之间为最佳。
下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:
1.
n
≤
30
,
指数级别
,
d
f
s
+
剪枝,状态压缩
d
p
1.n≤30, 指数级别, dfs+剪枝,状态压缩dp
1.n≤30,指数级别,dfs+剪枝,状态压缩dp
2.
n
≤
100
=
>
O
(
n
3
)
,
f
l
o
y
d
,
d
p
,高斯消元
2.n≤100 => O(n^3),floyd,dp,高斯消元
2.n≤100=>O(n3),floyd,dp,高斯消元
3.
n
≤
1000
=
>
O
(
n
2
)
,
O
(
n
2
l
o
g
n
)
,
d
p
,二分,朴素版
D
i
j
k
s
t
r
a
、朴素版
P
r
i
m
、
B
e
l
l
m
a
n
−
F
o
r
d
3.n≤1000 =>O(n^2),O(n^2logn),dp,二分,朴素版Dijkstra、朴素版Prim、Bellman-Ford
3.n≤1000=>O(n2),O(n2logn),dp,二分,朴素版Dijkstra、朴素版Prim、Bellman−Ford
4.
n
≤
10000
=
>
O
(
n
∗
n
)
,块状链表、分块、莫队
4.n≤10000 => O(n∗\sqrt{n}),块状链表、分块、莫队
4.n≤10000=>O(n∗n),块状链表、分块、莫队
5.
n
≤
100000
=
>
O
(
n
l
o
g
n
)
=
>
各种
s
o
r
t
,线段树、树状数组、
s
e
t
/
m
a
p
、
h
e
a
p
、拓扑排序,
d
i
j
k
s
t
r
a
+
h
e
a
p
p
r
i
m
+
h
e
a
p
、
K
r
u
s
k
a
l
、
s
p
f
a
、求凸包、求半平面交、二分、
C
D
Q
分治、整体二分、后缀数组、树链剖分、动态树
5.n≤100000=> O(nlogn) => 各种sort,线段树、树状数组、set/map、heap、拓扑排序,dijkstra+heapprim+heap、Kruskal、spfa、求凸包、求半平面交、二分、CDQ分治、整体二分、后缀数组、树链剖分、动态树
5.n≤100000=>O(nlogn)=>各种sort,线段树、树状数组、set/map、heap、拓扑排序,dijkstra+heapprim+heap、Kruskal、spfa、求凸包、求半平面交、二分、CDQ分治、整体二分、后缀数组、树链剖分、动态树
6.
n
≤
1000000
=
>
O
(
n
)
,
以及常数较小的
O
(
n
l
o
g
n
)
算法
=
>
单调队列、
h
a
s
h
、双指针扫描、并查集,
k
m
p
、
A
C
自动机,常数比较小的
O
(
n
l
o
g
n
)
的做法:
s
o
r
t
、树状数组、
h
e
a
p
、
d
i
j
k
s
t
r
a
、
s
p
f
a
6.n≤1000000=> O(n), 以及常数较小的 O(nlogn) 算法 => 单调队列、 hash、双指针扫描、并查集,kmp、AC自动机,常数比较小的 O(nlogn) 的做法:sort、树状数组、heap、dijkstra、spfa
6.n≤1000000=>O(n),以及常数较小的O(nlogn)算法=>单调队列、hash、双指针扫描、并查集,kmp、AC自动机,常数比较小的O(nlogn)的做法:sort、树状数组、heap、dijkstra、spfa
7.
n
≤
10000000
=
>
O
(
n
)
,双指针扫描、
k
m
p
、
A
C
自动机、线性筛素数
7.n≤10000000 => O(n),双指针扫描、kmp、AC自动机、线性筛素数
7.n≤10000000=>O(n),双指针扫描、kmp、AC自动机、线性筛素数
8.
n
≤
1
0
9
=
>
O
(
n
)
,判断质数
8.n≤10^9 => O(\sqrt{n}),判断质数
8.n≤109=>O(n),判断质数
9.
n
≤
1
0
1
8
=
>
O
(
l
o
g
n
)
,最大公约数,快速幂,数位
D
P
9.n≤10^18 => O(logn),最大公约数,快速幂,数位DP
9.n≤1018=>O(logn),最大公约数,快速幂,数位DP
10.
n
≤
1
0
1000
=
>
O
(
(
l
o
g
n
)
2
)
,高精度加减乘除
10.n≤10^{1000} => O((logn)2),高精度加减乘除
10.n≤101000=>O((logn)2),高精度加减乘除
11.
n
≤
1
0
100000
=
>
O
(
l
o
g
k
×
l
o
g
l
o
g
k
)
,
k
表示位数,高精度加减、
F
F
T
/
N
T
T
11.n≤10^{100000} => O(logk×loglogk),k表示位数,高精度加减、FFT/NTT
11.n≤10100000=>O(logk×loglogk),k表示位数,高精度加减、FFT/NTT
由数据范围确定时间复杂度反推算法
最新推荐文章于 2024-06-15 11:44:36 发布