考场上也没想到这道
t
3
t3
t3竟是整场比赛最可做的一道题。但是拿了全场最高的部分分,这是好的。
唉,学了插头
d
p
dp
dp但是却无法将其运用,我真傻,真的。
部分分已经很好的提示了这道题的正解是状压。先考虑
d
>
8
d>8
d>8,也就是我考场上没想出来的部分。
不妨将原问题做细微的变动,令
d
←
2
d
d\gets 2d
d←2d,那么
x
x
x可以移动到
x
x
x或
x
+
2
d
x+2d
x+2d两个位置,这样做的好处在于所有点都是朝一个方向运动。
以往我们对坐标的认识都是很大而不好处理的,但是这道题非常特殊,注意到
x
i
≤
150
x_i\le 150
xi≤150,因此可以直接看成是大小
≤
150
\le 150
≤150的棋盘,特别的,我们将
x
,
x
+
d
,
x
+
2
d
,
.
.
.
x,x+d,x+2d,...
x,x+d,x+2d,...排成一个横排,这样得到了一个宽
≤
⌊
x
i
d
⌋
\le \lfloor\frac{x_i}{d}\rfloor
≤⌊dxi⌋的矩阵。
注意到
⌊
x
i
d
⌋
≤
8
\lfloor\frac{x_i}{d}\rfloor\le 8
⌊dxi⌋≤8,这提示我们按行进行状压。但是同一行的坐标在数轴上不是连续的,注意到我们在插头
d
p
dp
dp中处理的路径也不是连续的,但是我们可以将它拼接起来,那么类似的,我们也可以看成是数轴上有若干个端点朝左右方向扩展,新建一个端点的代价是
a
a
a,扩展一个单位的代价是
b
b
b。甚至这道题目的情况也远没有插头
D
P
DP
DP复杂,只是这个想法比较隐晦而已。
观察一下这个表格,同一列在坐标轴上的位置是固定的,因此可以只用记录两个端点是否被线段覆盖。一个棋子也只能移动到同一行相邻的位置,因此情况并不复杂。那么这部分就做完了,复杂度
O
(
max
(
x
i
)
2
16
)
O(\max(x_i)2^{16})
O(max(xi)216)。
最后再来补充一下
d
≤
8
d\le 8
d≤8的部分。不得不说这个部分分设置得非常好。考场上想了一个巨麻烦的方法,但是其实没有必要,就直接记录后
d
d
d个位置那些点有棋子,以及前一个位置有没有被覆盖即可,这其实就是我考场的做法,但是考场上好像写复杂了。复杂度同样是
O
(
max
(
x
i
)
2
16
)
O(\max(x_i)2^{16})
O(max(xi)216)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」