【BZOJ4827】【HNOI2017】—礼物(FFT)

传送门

实际上旋转总共只会有nn种不同的配对方案
ans=i=1n(aibi+c)2ans=\sum_{i=1}^{n}(a_i-b_i+c)^2
拆开后=(a2+b22ab+c2+2c(ab))=\sum (a^2+b^2-2ab+c^2+2c(a-b))

a2+b2\sum {a^2+b^2}是定值,而nc2+2c(ab)nc^2+2c\sum(a-b)则是一个二次函数,找对称轴求最小值就可以了

现在就是求Min((aibi)Min(\sum(a_i*b_i)
考虑将AA翻转BB倍长就以一个卷积了
fftfft就完了

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
	char ch=getchar();
	int res=0,f=1;
	while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
	while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=getchar();
	return res*f;
}
const int N=100005;
const double pi=acos(-1);
struct plx{
	double x,y;
	plx(double _x=0,double _y=0):x(_x),y(_y){}
	friend inline plx operator +(const plx &a,const plx &b){
		return plx(a.x+b.x,a.y+b.y);
	}
	friend inline plx operator -(const plx &a,const plx &b){
		return plx(a.x-b.x,a.y-b.y);
	}
	friend inline plx operator *(const plx &a,const plx &b){
		return plx(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
	}
}a[N<<2],b[N<<2];
int lim=1,tim,rev[N<<2];
inline void fft(plx f[],int kd){
	for(int i=0;i<lim;i++)if(i<rev[i])swap(f[i],f[rev[i]]);
	for(int mid=1;mid<lim;mid<<=1){
		plx now=plx(cos(pi/mid),kd*sin(pi/mid));
		for(int i=0;i<lim;i+=(mid<<1)){
			plx w=plx(1,0);
			for(int j=0;j<mid;j++,w=w*now){
				plx a0=f[i+j],a1=w*f[i+j+mid];
				f[i+j]=a0+a1,f[i+j+mid]=a0-a1;
			}
		}
	}
	if(kd==-1)for(int i=0;i<lim;i++)f[i].x/=lim;
}
int n,m,x[N<<1],y[N<<1],sig,res,ans;
signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++)x[i]=read();
	for(int i=1;i<=n;i++)y[i]=y[i+n]=read();
	reverse(x+1,x+n+1);
	for(int i=1;i<=n;i++)a[i].x=x[i],res+=x[i]*x[i]+y[i]*y[i],sig+=x[i]-y[i];
	for(int i=1;i<=2*n;i++)b[i].x=y[i];
	int mid=-sig/n,db=1e18;
	for(int i=-1;i<=1;i++)db=min(db,n*(mid+i)*(mid+i)+2*(mid+i)*sig);
	while(lim<=4*n)lim<<=1,tim++;
	for(int i=0;i<lim;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(tim-1));
	fft(a,1),fft(b,1);for(int i=0;i<lim;i++)a[i]=a[i]*b[i];fft(a,-1);
	for(int i=1;i<=n;i++)ans=max(ans,(int)(a[n+i].x+0.5));
	cout<<res+db-2*ans<<'\n';
}
posted @ 2019-03-27 19:37  Stargazer_cykoi  阅读(100)  评论(0编辑  收藏  举报