- 首先,两个手环增加非负整数亮度,等于其中一个增加一个整数亮度,可以为负。
- 令增加量为\(x\),旋转以后的原数列为,那么在不考虑转圈圈的情况下,现在的费用就是:\[\sum_{i=1}^n\left(a_i+x-b_i\right)^2\]
- 即\[\sum_{i=1}^na_i^2+\sum_{i=1}^nb_i^2+nx^2+2x\left(\sum_{i=1}^na_i-\sum_{i=1}^nb_i\right)-2\sum_{i=1}^na_ib_i\]
- 前面两个是确定的,后面是\(y=ax^2+bx+c\)的形式,那么\(x=\frac{b}{-2a}\)。
- 所以只需要使得\(\sum a_i*b_i\)最大即可。
- 直接做不好做,翻转\(a\):\[\sum_{i=1}^na_{n-i+1}b_i\]
- 这不是一个卷积吗~
- 把\(b\)倍长后,其中卷起来后的每一项都对应了一种反转方案,直接\(fft\)后取最小值。
然后把前面的不变项加上,就是答案了。
#include#define R register int#define db double#define il inline #define ll long long using namespace std;const int N=1000000;const db pi=acos(-1.0);int n,m,x,nw,pik,a[N],b[N];ll ans;il int gi(){ R x=0,k=1;char c=getchar(); while(c!='-'&&(c<'0'||c>'9'))c=getchar(); if(c=='-')k=-1,c=getchar(); while(c<='9'&&c>='0')x=(x<<3)+(x<<1)+c-'0',c=getchar(); return x*k;}il int sqr(R x){return x*x;}namespace FFT{ int m,lim=1,er,Mx=-2e9,rd[N]; struct G{ db x,y; G (db xx=0,db yy=0){x=xx,y=yy;} }x[N],y[N]; G operator + (G a,G b){return G(a.x+b.x,a.y+b.y);} G operator - (G a,G b){return G(a.x-b.x,a.y-b.y);} G operator * (G a,G b){return G(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);} void fft(G *A,R op){ for(R i=0;i >1]>>1)|((i&1)<<(er-1)); fft(x,1),fft(y,1); for(R i=0;i