[ABC376F] Hands on Ring (Hard)
题目
[ABC376F] Hands on Ring (Hard)
题目考察:dp。
题目简述:
有一个有
有
数据范围:
-
-
-
-
## 做法 ### 朴素 dp **显然**,我们可以得到一个状态为 $\Theta(n^2q)$ 的 dp,设 $f_{i,j,k}$ 为第 $i$ 次操作中左手放在了 $j$ 节点,右手放在了 $k$ 节点,转移方程为($\text{dist}(x,y,z)$ 表示在不经过 $z$ 点的情况下,从 $x$ 到 $y$ 的距离): $$f_{i,j,k}=\min_{j_0=1}^n(\min_{k_0=1}^n(f_{i-1,j_0,k_0}+\min(\text{dist}(j_0,j,k_0)+\text{dist}(k_0,k,j),\text{dist}(k_0,k,j_0)+\text{dist}(j_0,j,k))))$$ 但是每个状态都需要 $\Theta(n^2)$ 转移,时间复杂度($\Theta(qn^4)$)不可接受(尽管能用滚动数组滚掉第一位)。 > #### 证明 > 证明先移动一个手再移动另一个手更优。 > 分类讨论: > 1. 如果另一只手挡住了这只手的运动路线,直接将另一只手移到一个位置就行了。 > 2. 否则另一只手不动就行了。
于是我们想到了后面的优化。
优化 1
我们发现,实际上有意义的状态并不多,第
优化 2
我们又发现,有意义的状态只有 map 或直接压维的方式解决,时间复杂度为
优化 3
我们又双叒叕发现,每个上一个状态只会出现
这样每次操作的有效状态为:
时间复杂度为
代码
这呢