分块的时间复杂度
O
(
15
∗
n
5
3
)
O(15*n^{\frac{5}{3}})
O(15∗n35) ,考虑用
a
n
s
[
i
]
[
j
]
ans[i][j]
ans[i][j] 记录块的答案,取
B
=
n
2
3
B=n^{\frac{2}{3}}
B=n32 ,则查询和修改均为
O
(
n
2
3
)
O(n^{\frac{2}{3}})
O(n32) 。(这里就没必要重构了,因为你会发现无论如何取
B
=
n
2
3
B=n^{\frac{2}{3}}
B=n32 都能达到最优,而重构的时间复杂度是
N
2
B
2
∗
B
=
N
2
B
=
N
4
3
\frac{N^2}{B^2}*B=\frac{N^2}{B}=N^{\frac{4}{3}}
B2N2∗B=BN2=N34 ,再乘上要重构的次数
N
1
3
N^\frac{1}{3}
N31 ,因为查询是
N
2
3
N^\frac{2}{3}
N32 ,所以重构次数已经最小了,而实际上暴力修改是
N
2
3
∗
N
=
N
5
3
N^{\frac{2}{3}}*N=N^{\frac{5}{3}}
N32∗N=N35 ,所以重构的复杂度本质上等价于对每个数进行修改,这个可以自己探究)
设
d
p
[
i
]
[
j
]
[
k
]
dp[i][j][k]
dp[i][j][k] 表示当前处理到第
i
i
i 个音符,左手在
j
j
j ,右手在
k
k
k 的最短时间。暴力
d
p
dp
dp 复杂度
O
(
n
4
)
O(n^4)
O(n4) 。观察到任意状态一定有
j
=
p
o
s
i
j=pos_i
j=posi 或
k
=
p
o
s
i
k=pos_i
k=posi 成立,于是我们只需要枚举一个参数即可,朴素算法的时间复杂度
O
(
n
3
)
O(n^3)
O(n3) 。
本题是
E
E
E 题的加强版。我们观察到
d
p
dp
dp 转移是
O
(
n
)
O(n)
O(n) 的,考虑用数据结构优化。首先有
d
p
dp
dp 转移式:
d
p
[
i
]
[
k
]
=
m
i
n
(
d
p
[
i
]
[
k
]
,
d
p
[
i
−
1
]
[
l
]
+
g
e
t
d
i
s
t
(
p
o
s
[
i
]
,
k
,
p
o
s
[
i
−
1
]
,
l
)
)
;
dp[i][k]=min(dp[i][k],dp[i-1][l]+getdist(pos[i],k,pos[i-1],l));
dp[i][k]=min(dp[i][k],dp[i−1][l]+getdist(pos[i],k,pos[i−1],l));
这里有一个
m
a
x
max
max 函数,我们来讨论一下哪一项取最大值,那么另一项就有一个转移区间。
分类讨论:
p
o
s
[
i
]
pos[i]
pos[i] 对应
p
o
s
[
i
−
1
]
pos[i-1]
pos[i−1] ,此时
a
b
s
(
p
o
s
[
i
]
−
p
o
s
[
i
−
1
]
)
abs(pos[i]-pos[i-1])
abs(pos[i]−pos[i−1]) 是定值,对于给定的
j
j
j ,询问区间是
[
j
−
l
s
t
,
j
+
l
s
t
]
[j-lst,j+lst]
[j−lst,j+lst] ,这是一个经典的滑动窗口问题。
p
o
s
[
i
]
pos[i]
pos[i] 对应
l
l
l ,此时
a
b
s
(
p
o
s
[
i
]
−
l
)
abs(pos[i]-l)
abs(pos[i]−l) 是定值,对
j
j
j 在区间
[
p
o
s
[
i
−
1
]
−
l
s
t
2
,
p
o
s
[
i
−
1
]
+
l
s
t
2
]
[pos[i-1]-lst2,pos[i-1]+lst2]
[pos[i−1]−lst2,pos[i−1]+lst2] 有贡献,我们可以记录一个前缀和后缀的最小值。
注意两种情况的优化思路是不一样的,其原因在于选取的不变量不同。在
c
a
s
e
1
case 1
case1 中,我们限定
j
j
j 不变;在
c
a
s
e
2
case 2
case2 中,我们限定
l
l
l 不变,将贡献转化成了前缀和后缀的处理。
将上述两种情况综合起来,就得到了我们的正解。时间复杂度
O
(
n
m
)
O(nm)
O(nm) ,状态转移
O
(
1
)
O(1)
O(1) 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」