CF1681E Labyrinth Adventures

发布时间 2023-07-21 08:35:03作者: Ender_32k

目前为止我是 Luogu 上最优解,不保证后面会不会被神仙同学刷下来,比如 @sinsop90。

upd : 现在不是了,@JWRuixi 用循环展开把我爆踩/ll。


\(a_{i,0}\) 表示第 \(i\) 层上面那个门,\(a_{i,1}\) 表示右边的门,\(b_{i,0/1}\) 分别表示它们连向的格子

首先对于一个询问点对 \((u,v)\),我们考虑一个平凡的 dp:

\(dp_{i,0/1}\) 表示从起点 \(u\) 出发并从第 \(i\) 层的上方/右方走出的最短路,包括走出后到达的那个格子,即如果是从 \(a_{i,0}\) 上方走出,答案包括点 \((x(a_{i,0})+1,y(a_{i,0}))\) 的贡献。

比如上面这张图,对于询问 \(u=(2,2)\)\(dp_{3,0}=4\),即 \((2,2)\to(2,1)\to(3,1)\to(3,2)\to (4,2)\),一共走了 \(4\) 步。

显然有:

\[dp_{i,j}=\min\limits_{k\in \{0,1\}}\{dp_{i-1,k}+dis(b_{i-1,k},b_{i,j})\} \]

这个 \(dis\) 显然是可以 \(O(1)\) 计算且固定的,那我们就做完了。

把这个转移写成矩阵形式:

\[[dp_{i-1,0}\quad dp_{i-1,1}]\begin{bmatrix}dis(b_{i-1,0},b_{i,0})\quad dis(b_{i-1,0},b_{i,1})\\dis(b_{i-1,1},b_{i,0})\quad dis(b_{i-1,1},b_{i,1})\end{bmatrix}=[dp_{i,0}\quad dp_{i,1}] \]

转移矩阵对于每一位是固定的,于是对于 \(u\to v\)\(l\) 层到 \(r\) 层的询问,中间 \(l+1,r-1\) 层的转移可以倍增求区间积,两边暴力转移即可。

复杂度 \(O(b^3q\log n)\)\(b\) 为矩阵大小即 \(2\)

评测记录。