[ABC211G]Jumping sequence
Posted StaroForgin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ABC211G]Jumping sequence相关的知识,希望对你有一定的参考价值。
Jumping sequence
题解
卡空间就离谱。
首先,我们的四种操作是让
x
x
x轴与
y
y
y轴其中一个走
d
i
d_{i}
di步或
−
d
i
-d_{i}
−di步。
所以对应下来每个方向就有
d
i
,
−
d
i
,
0
d_{i},-d_{i},0
di,−di,0三种取值,总共有
9
9
9种组合,但事实上合法的走法只有
4
4
4种,也就是说我们有相当一部分走法是不合法的,我们在这种情况下不同方向走的步数不是独立的。
既然不是独立的,我们就把它变成独立的,方便我们的计算,这样我们每次就只需要处理一维了。
我们可以考虑将原来的图很过来放,使得
x
′
=
x
+
y
,
y
′
=
x
−
y
x'=x+y,y'=x-y
x′=x+y,y′=x−y。
很明显,此时的
(
x
′
,
y
′
)
(x',y')
(x′,y′)与
(
x
,
y
)
(x,y)
(x,y)是一一对应的。
那么,我们的四个走的操作相当于是向量
(
±
d
i
,
±
d
i
)
(\\pm d_{i},\\pm d_{i})
(±di,±di)。
此时,
x
x
x轴与
y
y
y轴都只有
±
d
i
\\pm d_{i}
±di两个取值,
x
x
x轴的取值与
y
y
y轴的取值是没有关系的,也就是说,这两者是独立的。
所以我们只需要单独更新出
x
x
x轴上到
A
+
B
A+B
A+B与
y
y
y轴上到
A
−
B
A-B
A−B的路径,将两者加在一起就有了到
(
A
,
B
)
(A,B)
(A,B)的路径。
我们定义
d
p
i
,
j
dp_{i,j}
dpi,j表示走完第
i
i
i步后点
j
j
j能否被访问到,容易得到
d
p
dp
dp转移式,
d
p
i
,
j
=
d
p
i
−
1
,
j
−
d
i
∣
d
p
i
−
1
,
j
+
d
i
dp_{i,j}=dp_{i-1,j-d_{i}}|dp_{i-1,j+d_{i}}
dpi,j=dpi−1,j−di∣dpi−1,j+di。
以上的
d
p
dp
dp式明显可以通过 bitset 进行优化,优化后的空间复杂度为:
2000
×
7.2
×
1
0
6
×
4
×
4
/
(
102
4
2
×
32
)
≈
3433
M
B
2000\\times 7.2\\times 10^6\\times4\\times4/(1024^2\\times32)\\approx 3433MB
2000×7.2×106×4×4/(10242×32)≈3433MB
明显是过不了的,会被卡MLE,考虑优化。
我们先将所有的
d
i
d_{i}
di按
A
+
B
,
A
−
B
A+B,A-B
A+B,A−B的方向加上去,即与它们同正负,在将其撤回,由于这样就不用考虑与答案不在
0
0
0的同一边的状态,也就可以再给空间除掉一个二,大概有
1717
M
B
1717MB
1717MB左右,还是会被卡空间。
继续观察,我们记
t
i
t_{i}
ti表示
d
i
d_{i}
di是否会被撤回,会撤回是
1
1
1,不会撤回是
0
0
0,下面我们都不妨设
A
+
B
,
A
−
B
⩾
0
A+B,A-B\\geqslant 0
A+B,A−B⩾0,明显有
∑
i
=
1
n
d
i
−
2
∑
i
=
1
n
t
i
d
i
=
A
±
B
⇔
∑
i
=
1
n
t
i
d
i
=
∑
i
=
1
n
d
i
−
A
∓
B
2
\\sum_{i=1}^{n} d_{i}-2\\sum_{i=1}^{n} t_{i}d_{i}=A\\pm B\\Leftrightarrow\\sum_{i=1}^{n}t_{i}d_{i}=\\frac{\\sum_{i=1}^{n}d_{i}-A\\mp B}{2}
i=1∑ndi−2i=1∑ntidi=A±B⇔i=1∑ntidi=2∑i=1ndi−A∓B
很明显,当
∑
i
=
1
n
d
i
−
A
∓
B
\\sum_{i=1}^{n} d_{i}-A\\mp B
∑i=1ndi−A∓B是奇数时是无解的,这两者有是同正负的,我们可以将终点就设为
∑
i
=
1
n
d
i
−
A
∓
B
\\sum_{i=1}^{n}d_{i}-A\\mp B
∑i=1ndi−A∓B,然后每一步有
+
d
i
+d_{i}
+di与不动两种情况,看最后是否能到我们的终点,这同样是上面的
d
p
dp
dp的样子,但这样又可以给我们的值域除个二,现在就只有
859
M
B
859MB
859MB了。
直接用
b
i
t
s
e
t
bitset
bitset转移,然后找出到
∑
i
=
1
n
d
i
−
A
∓
B
\\sum_{i=1}^{n}d_{i}-A\\mp B
∑i=1ndi−A∓Super Jumping! Jumping! Jumping!
Super Jumping! Jumping! Jumping!
Super Jumping! Jumping! Jumping!
hdu 1087 Super Jumping! Jumping! Jumping!