因为可以加上一个常数C,说是非负整数,但其实A手环加上,就等于B手环减去,于是把m范围扩充到[-100,100]即可。
然后所求变为:
$$\sum (x_i-y_i+C)$$
接着拆开,可以得到:
$$\sum(x_i^2+y_i^2+C^2)+2*C*\sum(x_i-y_i)+2*\sum(x_i*y_i)$$
然后发现这些有常量,可变的C所对应的x和y是常数,而与顺序有关的xi*yi又是与C无关的。所以我们可以先求出的最大值xi*yi。如果我们将B手环在输入之后反转一下,可以发现当翻转前A与B发生错位之时,每一个错位都可以对应反转之后的B与A的FFT的乘积的各个项的系数。
然后再枚举C从[-m,m]那么答案就出来了。
不会FFT的就去学吧。
1 #include2 #include 3 #include 4 #include 5 #include 6 #define C complex 7 #define pf(a) ((a)*(a)) 8 using namespace std; 9 const int MAXN=1000000,INF=0x3f3f3f3f;10 const double pi=acos(-1.0);11 int n,m,L,G,Max,Val,ans=INF,sum1,sum2;12 int R[MAXN],V[MAXN];13 C A[MAXN],B[MAXN];14 inline int gi(){ int res; scanf("%d",&res); return res;}15 void FFT(C *a,int p)16 {17 for(int i=0;i >1]>>1)|((i&1)<