BZOJ4827 [Hnoi2017]礼物
Solution
如果一串数的增加,不就等于另一串数减吗?
那么我们可以把答案写成另一个形式:
\(ans=\sum_{i=1}^n(x_i-y_i+C)^2\)
\(y\)可以是重新排列
那么疯狂拆一下式子,化简之后就是:
\(ans=\sum_{i=1}^nx_i^2+\sum_{i=1}^ny_i^2+\sum_{i=1}^nC^2+2*C*\sum_{i=1}^n(x_i-y_i)-2*\sum_{i=1}^nx_i*y_i\)
如果我们枚举\(C\),那么现在的任务就是算出\(\sum_{i=1}^nx_i*y_i\)的最大值,这样才能让\(ans\)最小.
怎么做呢?
如果把\(y\)数列翻转一下,那么就是:
\(\sum_{i=1}^nx_i*y_i=\sum_{i=1}^nx_i*y_{n-i}\) 这个不就是卷积?
考虑可以逆时针旋转怎么做?断环成链就好了啊.
那么就是把\(y\)串翻转然后复制一遍,求一个卷积然后走人了.
是的结束了.
代码实现
#include #include #include #include #include #include #include #include