ABC221G Jumping Sequences 题解

Jumping Sequences

把移动的上下左右改成左上、左下、右上、右下(坐标轴旋转 45°)。则最终目的地是 (A+B,AB)

(以前移动的方式是 (±di,0),(0,±di)。现在每次移动的方式是 (±di,±di)

x,y 两维可以分开考虑。

等价问题:从 d1dn 中选若干个数和为 w=A+Bdi2


DP,f[i][j] 表示前 i 个数和为 j 是否可行。

但是这个复杂度是 O(n2D) 的,i 的范围 nj 的范围 n×D.D=maxdi

如何优化?

可以 bitset 优化。O(n2d32)。有点危险。


介绍一种新的方法。O(nD)

我们找到一个数 bX=d1++db1w,d1++db>w

定义 Balanced Set:{1,2,,b1} 是一个 BS。 所有能通过下列两个操作从 {1,2,,b1} 变化到达的也是 BS。

  1. balanced insert:插入一个 b 的数。这个操作要求当前的和 w

  2. balanced delete:删除一个 <b 的数。这个操作要求当前的和 >w

观察:所有 BS 的总和 [wD,w+D]

观察:最优解也是一个 BS。

为了方便,重新设状态定义,从 b 处向两边延申。

fl,r,j 表示考虑 [l,r] 内的操作,是否可以凑出 j

初值 fb+1,b,X=true.

转移:

  • fl,r,xfl,r1,x,fl+1,r,x.(不选)

  • fl,r,x+drfl,r1,x.(xw)

  • fl,r,xdlfl+1,r,x.(x>w)

但复杂度还是没变。再重新设计。

gr,w 表示满足 fl,r,w=truel 最大是多少。若不存在则为 0

  • gr,xgr1,x.

  • gr,x+drgr1,x.(xw)

  • gr,xdll.(x>w,l<gr,w)

从左边转移但不操作 l 的情况不用考虑,因为 g 是取 max

状态数少了,但转移复杂度没变。瓶颈在于第三类转移。

注意到 l<gr1,x 时,其会在 r1 用第一类转移到。所以只要转移 lgr1,x 即可。

对于一个 x,转移复杂度为 O(gr,xgr1,w)=O(n),所以总复杂度 O(nD)

posted @   FLY_lai  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示