[ZJOI2014] 力
首先转化一下式子:
Ek=i=1∑k−1(k−i)2qi−i=k+1∑n(k−i)2qi=E1k+E2k
可以令 q0=0,就能推出 E1k 的卷积形式:
E1k=i=0∑k−1(k−i)2qi=i=0∑k−1figk−1−i
其中 fi=qi,gi=(i+1)21。
由于卷积的指标是从 0 开始的,所以对于 E2k,需要令 j=n−i+1,那么:
E2k=j=1∑n−k(n−k−j+1)2qn−j+1=j=0∑n−kfjgn−k−j
其中 fi=qn−i+1,gi=(i+1)21,并且 qn+1=0。
复杂度主要是一次 FFT,为 O(nlogn)。
AC Code。
[AHOI2017/HNOI2017] 礼物
首先,给 y 整体 +c 对贡献的影响等价于对 x 整体 −c,所以我们可以把这个条件转化成 x 整体加一个整数。
把这个式子拆一下:
i=1∑n(xi+c−yi)2=nc2+(2i=1∑nxi−2i=1∑nyi)c+i=1∑nxi2+i=1∑nyi2−2i=1∑nxiyi
可以看出,这是一个关于 c 的二次函数,并且二次项、一次项系数与排列顺序无关。
现在我们要求常数项的最小值,转化为求 ∑xiyi 的最大值。
如果把 y1∼yn 复制一遍到 yn+1∼y2n,会发现每一种排列都对应着 x1∼xn 与 yd∼yn+d 对应相乘再相加。
手玩一下就可以知道如果令 f={0,x1,x2,…,xn,0,0,…},g={yn,yn−1,…,y1,yn,yn−1,…,y1},然后 h=f∗g 那么 hn∼h2n−1 就是我们要求的答案了。
复杂度主要是一次 NTT,为 O(nlogn)。
AC Code。
[CF755G] PolandBall and Many Other Balls
状态转移方程比较简单:fn,k=fn−1,k+fn−1,k−1+fn−2,k−1。
如果我们把 fn 看成一个最高 k 次的多项式,那么就有 fn=fn−1+xfn−1+xfn−2。
这可以写成 [fnfn−1]=[x+11x0][fn−1fn−2]。
显然地,f0=1,f1=1+x,这些多项式的次数不超过 k,所以复杂度是 O(klogklogn)。
AC Code。
[TJOI2017] DNA
下面设 S 为短串,T 为长串。
我们需要对每一个位置求出失配数量,考虑到本题目字符集小,所以逐个考虑所有字符。
设当前字符是 1,非当前字符是 0,那么我们希望 Si=1 时 Ti=1,Si=0 时 Ti 无所谓,所以可以写出 ∑Si(1−Ti) 就是每一段的失配数量。
把每个字符的失配数量加起来就是总的失配数量。
这个和式同样可以把 S 串翻转过来,并在后面补 0 到与 T 一样长,那么每一个和就对应它们卷积的一个位置。
复杂度为单次 O(∣Σ∣∣T∣log∣T∣),其中 Σ 是字符集。
AC Code。
[CF528D] Fuzzy Search
和上面的题目一样,可以逐个考虑所有字符。
这里的前后 k 个字符,可以用一个差分数组来把每个字符前后 k 个位置都打上标记。
复杂度为 O(∣Σ∣nlogn),其中 Σ 是字符集。
AC Code。