P16328 夜曲 题解
Solve
可以很理解or发现,诺s可以变成t,那么s在完成所有操作后的每个字符,都是由某个位置一点一点爬过来的。我们可以把字符移动的起始点和终点二元组看成一个向量。
同时,由于一次只能爬一个单位,可以发现对于任意一个可以使得s到达t的操作序列,他们的移动向量都不会同时相反且相交。然后我们同时也可以发现,诺两个向量方向相同,不能存在一个向量是另一个向量的子集。不然比较小的的向量的移动结果会被比较大的向量的移动过程覆盖。
我们尝试从结果也就是\(t\)来分析。我们尝试记录每个字符的来源位置。
令数组\(f[i]\)代表在\(t[i]\)由\(s[f[i]]\)运动而来。
将前面的两个限制加入到f中,f肯定单调不减。
诺存在一个\(f\),使得\(s\)可以遵循\(f\)变换为\(t\),且\(f\)合法。由于字符可以向左移动,也可以向右移动,故代价为
我们考虑如何构造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\)

浙公网安备 33010602011771号