笔记-[AH2017/HNOI2017]礼物

笔记-[AH2017/HNOI2017]礼物

[AH2017/HNOI2017]礼物


[egin{split} ans_i=&sum_{j=1}^n(a_j-b_j+i)^2\ =&sum_{j=1}^n(a_j^2+b_j^2+i^2-2a_jb_j+2ia_j-2ib_j)\ =&sum_{j=1}^na_j^2+sum_{j=1}^nb_j^2+ni^2+2isum_{j=1}^na_j-2isum_{j=1}^nb_j-2sum_{j=1}^na_jb_j\ end{split} ]


#include <bits/stdc++.h>
using namespace std;

//Start
#define lng long long
#define db double
#define mk make_pair
#define pb push_back
#define fi first
#define se second
#define rz resize
const int inf=0x3f3f3f3f;
const lng INF=0x3f3f3f3f3f3f3f3f;

//Data
const int N=3e5;
int n,m;
lng sa,saa,sb,sbb,sab[N+7],ans=INF;

//FFT
const db Pi=acos(-1);
typedef pair<db,db> cp;
cp operator+(const cp a,const cp b){return mk(a.fi+b.fi,a.se+b.se);}
cp operator-(const cp a,const cp b){return mk(a.fi-b.fi,a.se-b.se);}
cp operator*(const cp a,const cp b){return mk(a.fi*b.fi-a.se*b.se,a.fi*b.se+a.se*b.fi);}
vector<cp> a(N+7),b(N+7);
int lim=1,ln,r[N+7];
void FFT(vector<cp>&f,int t){
	for(int i=0;i<lim;i++)if(i<r[i]) swap(f[i],f[r[i]]);
	for(int mid=1;mid<lim;mid<<=1){
		cp wn(mk(cos(Pi/mid),sin(Pi/mid)*t));
		for(int j=0;j<lim;j+=(mid<<1)){
			cp w(mk(1,0));
			for(int k=j;k<mid+j;w=w*wn,k++){
				cp x(f[k]),y(w*f[mid+k]);
				f[k]=x+y,f[mid+k]=x-y;
			}
		}
	}
}

//Main
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1,x;i<=n;i++)
		scanf("%d",&x),a[n+i].fi=a[i].fi=x,sa+=x,saa+=1ll*x*x;
	for(int i=1,x;i<=n;i++)
		scanf("%d",&x),b[n+1-i].fi=x,sb+=x,sbb+=1ll*x*x;
	while(lim<=((n<<1)+n)) lim<<=1,ln++;
	for(int i=0;i<lim;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(ln-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=0;i<lim;i++) sab[i]=a[i].fi/lim+0.5;
	for(int i=1;i<=n;i++)
		for(int j=-m;j<=m;j++)
			ans=min(ans,saa+sbb+n*j*j+2ll*j*sa-2ll*j*sb-2ll*sab[i+n]);
	printf("%lld
",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/George1123/p/12802464.html