显然,yi 加上 c 可以看成是 xi 减去 c。
所以就变成了 xi 加上一个整数(可正可负)。
现将 x 环拆成一个长度为 2n 的序列 a(复制一遍),把 y 环拆成一个长度为 n 的序列 b。
那么旋转操作就可以看成是 b 序列与 a 序列中每一个长度为 n 的子串匹配求值。
也就是说,求这个东西的最小值:∑j=0n−1(ai+j−bj+c)2(0≤i<n)。
接下来推式子:(设 x 环的和是 suma,y 环的和是 sumb,x 环的平方和是 powa,y 环的平方和是 powa)
====i=0minn−1j=0∑n−1(ai+j−bj+c)2i=0minn−1j=0∑n−1(ai+j−bj)2+c2+2(ai+j−bj)ci=0minn−1[nc2+j=0∑n−1(ai+j−bj)2+2cj=0∑n−1(ai+j−bj)]i=0minn−1[nc2+j=0∑n−1(ai+j2+bj2−2ai+jbj)+2c(j=0∑n−1ai+j−j=0∑n−1bj)]i=0minn−1(nc2+powa+powb−2j=0∑n−1ai+jbj+2c(suma−sumb))
发现 powa+powb 是定值,而和 c 有关的 nc2+2c(suma−sumb) 可以用二次函数最值 O(1) 求,也就是说我们只需要求 −2∑