[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=xy
很明显,此时的 ( 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 AB的路径,将两者加在一起就有了到 ( 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=dpi1,jdidpi1,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,AB的方向加上去,即与它们同正负,在将其撤回,由于这样就不用考虑与答案不在 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,AB0,明显有
∑ 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=1ndi2i=1ntidi=A±Bi=1ntidi=2i=1ndiAB
很明显,当 ∑ i = 1 n d i − A ∓ B \\sum_{i=1}^{n} d_{i}-A\\mp B i=1ndiAB是奇数时是无解的,这两者有是同正负的,我们可以将终点就设为 ∑ i = 1 n d i − A ∓ B \\sum_{i=1}^{n}d_{i}-A\\mp B i=1ndiAB,然后每一步有 + 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=1ndiASuper Jumping! Jumping! Jumping!

Super Jumping! Jumping! Jumping!

Super Jumping! Jumping! Jumping!

hdu 1087 Super Jumping! Jumping! Jumping!

1087 Super Jumping! Jumping! Jumping! 动态规划

Super Jumping! Jumping! Jumping! HDU - 1087