专栏文章

Yet Another Many Moves Problem.

P14564题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min0wt57
此快照首次捕获于
2025/12/01 18:45
3 个月前
此快照最后确认于
2025/12/01 18:45
3 个月前
查看原文
写了个垃圾做法,看来我对 Many Moves 的理解还不够深刻。
从小往大扫时间。这个问题没有后效性,考虑 dp。
yi,jy_{i,j} 表示时刻 ii 的第 jj 个音符所在位置,其中 j{1,2}j\in \{1, 2\}。注意到在第 ii 个时刻,为了完成要求,一定有一只手会移动到 yi,1y_{i,1} 这个位置,并且为了保证花费最小,在当前时刻一定不会再移动这只手。所以设 fi,jf_{i,j} 表示在第 ii 个时刻,从初始状态依次完成前 ii 个要求,最后两只手分别位于 yi,1y_{i,1}jj 的最小花费。那么答案就是 minj=1nfm,j\min\limits_{j=1}^nf_{m,j}
dis(i,j)\operatorname{dis}(i,j)i,ji,j 两点的环上距离,显然 dis(i,j)=min{ij,nij}\operatorname{dis}(i,j)=\min\{|i-j|,n-|i-j|\}
考虑转移。枚举 i1i-1 时刻另一只手在哪个位置,记为 kk
ii 时刻只有一个音符,那么考虑两只手分别怎么移动,有:
fi,j=mink=1nmin{fi1,k+dis(k,j)+dis(yi1,1,yi,1),fi1,k+dis(k,yi,1)+dis(yi1,1,j)}f_{i,j}=\min\limits_{k=1}^n\min\{f_{i-1,k}+\operatorname{dis}(k,j)+\operatorname{dis}(y_{i-1,1},y_{i,1}),f_{i-1,k}+\operatorname{dis}(k,y_{i,1})+\operatorname{dis}(y_{i-1,1},j)\}
注意到 fi,j+dis(j,k)fi,kf_{i,j}+\operatorname{dis}(j,k)\ge f_{i,k}。因为 fi,jf_{i,j} 表示从初始状态开始依次完成前 ii 个要求后,最终两只手位于 yi,1y_{i,1}jj。加上 dis(j,k)\operatorname{dis}(j,k) 后就是再从 jj 走到 kk,相当于完成了一个这样的过程:从初始状态开始依次完成前 ii 个要求,最终两只手位于 yi,1y_{i,1}kk。而 fi,kf_{i,k} 表示该过程的最小花费,所以上式自然成立。
那么转移方程可以改写成:
fi,j=min{fi1,j+dis(yi1,1,yi,1),fi1,yi,1+dis(j,yi1,1)}f_{i,j}=\min\{f_{i-1,j}+\operatorname{dis}(y_{i-1,1},y_{i,1}),f_{i-1,y_{i,1}}+\operatorname{dis}(j,y_{i-1,1})\}
ii 时刻有两个音符,仍可用上式求出 fi,yi,2f_{i,y_{i,2}}。其他的位置不能这样求因为不能保证转移的过程中经过了 yi,2y_{i,2}
注意我们状态的定义,其应当满足这个状态完成了前 ii 个要求。所以对于剩余位置 jjfi,jf_{i,j} 对应的移动方案一定可以划分为两个部分:先完成前 ii 个要求且两只手恰好在 yi,1y_{i,1}yi,2y_{i,2},再 yi,2y_{i,2} 那只手移动到 jj。所以有:fi,j=fi,yi,2+dis(yi,2,j)f_{i,j}=f_{i,y_{i,2}}+\operatorname{dis}(y_{i,2},j)
扫描 ii 的过程中用一个数据结构维护当前的所有 fjf_j。转移都是区间操作的形式,考虑使用线段树维护。
将环上距离拆开可以发现,我们要支持的其实是以下几种操作:
  • 区间 fjmin{fj+x,j+y,j+z}f_j\leftarrow \min\{f_j+x,j+y,-j+z\}
  • 求区间 minfj\min f_j
每个位置维护一个三列的矩阵,则上述操作可以轻松使用 (min,+)(\min,+) 矩阵乘法实现。不过可以注意到只有三个位置是有用的,因此可以只记录那三个位置的信息,这样常数小一点。
认为 n,mn,m 同阶,时间复杂度 O(mlogn)\mathcal{O}(m\log n),空间复杂度 O(n)\mathcal{O}(n)

评论

0 条评论,欢迎与作者交流。

正在加载评论...