P16328 夜曲 题解

Solve

可以很理解or发现,诺s可以变成t,那么s在完成所有操作后的每个字符,都是由某个位置一点一点爬过来的。我们可以把字符移动的起始点和终点二元组看成一个向量。

同时,由于一次只能爬一个单位,可以发现对于任意一个可以使得s到达t的操作序列,他们的移动向量都不会同时相反且相交。然后我们同时也可以发现,诺两个向量方向相同,不能存在一个向量是另一个向量的子集。不然比较小的的向量的移动结果会被比较大的向量的移动过程覆盖。

我们尝试从结果也就是\(t\)来分析。我们尝试记录每个字符的来源位置。

令数组\(f[i]\)代表在\(t[i]\)\(s[f[i]]\)运动而来。

将前面的两个限制加入到f中,f肯定单调不减。

诺存在一个\(f\),使得\(s\)可以遵循\(f\)变换为\(t\),且\(f\)合法。由于字符可以向左移动,也可以向右移动,故代价为

\[max_{i=1}^n\{max(i-f[i],f[i]-i)\} \]

我们考虑如何构造f。

尝试二分构造,限制最大的\(|i-f[i]|\)不超过\(k\)

分类讨论

  • 诺对于t的一个字符。s中不存在位置pos使得满足\(|i-pos|<=k且f[i-1]<=pos\),那么当限制为\(k\)时,无\(f\)的解。

  • 诺对于t的一个字符。\(s\)中仅存在一个位置\(pos\)使得满足\(|i-pos|<=k\)\(f[i-1]<=pos\),那么将\(f[i]=pos\).

  • 诺对于t的一个字符。\(s\)中仅存在多个位置\(pos\)使得满足\(|i-pos|<=k且f[i-1]<=pos\),那么选择最小的\(pos\)然后,\(f[i]=pos\).

二分结束后,诺存在\(k\),则有解,输出最小的\(k\),否则无解.

难点分析

前面对于两个向量的性质的分析都比较简单。

难点在于想出使用\(f\)数组同时表示所有的向量 然后利用二分构造\(f\)

posted @ 2026-06-27 15:49  txp2025  阅读(4)  评论(0)    收藏  举报