[ABC265F] Manhattan Cafe Solution

更好的阅读体验戳此进入

题面

n 维空间中存在 p,q 两点,求有多少个整点满足到 p,q 的曼哈顿距离均不大于 d

Solution

细节巨多的 DP。

首先有一个较为显然的 3D1DO(nd3) 的做法,即令 dp(i,j,k) 表示考虑前 i 维到 p 曼哈顿距离为 j,到 q 曼哈顿距离为 k 的方案数,然后这个东西 O(d) 的转移较为显然,即枚举 i 维的坐标,令其为 x 则转移为:

dp(i,j,k)=xdp(i,j|xpi|,k|xqi|)×[|xpi|d|xqi|d]

然后这个东西实际上是可以通过类似前缀和的东西转移的,但是是类似对角线前缀和的,比较复杂细节巨多,所以这里参考以下机房大佬 @sssmzy 的做法。

考虑将状态修改为 dp(i,j,k) 表示考虑前 i 维,到 pq 的曼哈顿距离和为 j,到 p 的曼哈顿距离为 k

这个时候考虑两种可能性,对于某次枚举的位置 x,若满足 pixqiqixpi,也就是说 xp,q 之间,那么 j 这一维是从 j|piqi| 转移而来,而 kkk|piqi| 这段区间转移而来,那么即可以用前缀和转移。

考虑对于 xp,q 之外的情况,那么对于每个 xx+1xx1,显然存在 jj+2,kj+1。所以我们只需要再维护一个前缀和 sum2(j,k)=sum2(j2,k1)+dp(j,k) 即可。

具体来说,维护一个 sumsum2,意义同上。同时因为空间问题我们需要把第一维滚动掉。具体的转移即若 j<|piqi| 那么 dp(j,k)=0。否则令 dis=|piqi|,即为:

dp(j,k)=sum(jdis,k)sum(jdis,kdis1)+sum2(jdis2,k1)+sum2(jdis2,kdis1)

转移的意义即为在 p,q 中间和分别在 p,q 的两侧。

于是每次处理完 DP 后清空并重新维护 sum,sum2 即可。

最终复杂度为 O(nd2),可以通过。

Code

UPD

update-2023_01_05 初稿