[ABC376F] Hands on Ring (Hard)

· · 题解

题目

[ABC376F] Hands on Ring (Hard)

题目考察:dp。
题目简述:
有一个有 n 个节点的环,一开始你的两只手分别在 1 节点和 2 节点,每次你的手可以移动到相邻两个节点(即假设原来在 x 处,那么就能移动到 (x+n-2)\bmod n+1x\bmod n+1),前提是另一只手不在将要移动的格子上。
q 次操作,每次操作(h_i,t_i)要求你将左手或右手(h_i)移到某一个格子(t_i),问所有操作结束之后最少移动多少次。
数据范围:

于是我们想到了后面的优化。

优化 1

我们发现,实际上有意义的状态并不多,第 i 次操作你的一只手一定要在 t_i 节点上,这样的话有意义的状态就变成了 \Theta(n) 个,但时间复杂度仍然是 \Theta(qn^3)

优化 2

我们又发现,有意义的状态只有 \Theta(n) 个,所以我们不需要 \Theta(n^2) 枚举上一个状态,直接用 map 或直接压维的方式解决,时间复杂度为 \Theta(qn^2)(可能带 \log)。

优化 3

我们又双叒叕发现,每个上一个状态只会出现 1 个第 2 种情况,于是我们换种方式转移(我不会告诉你我忘了叫什么了)。
这样每次操作的有效状态为:dp_{i,i-1}dp_{i,i+1}(所有的上一个的有效状态均可转移),其他的 dp_{i,j}(一个有效状态只会转移一个)。
时间复杂度为 \Theta(qn)

代码

这呢