1 条题解

  • 0
    @ 2023-6-21 20:01:49

    C++ :

    #include<algorithm>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    typedef double flo;
    const flo pi=acos(-1.);
    const int N=1<<17;
    struct vec{flo x,y;}a[N],b[N];
    vec operator+(vec a,vec b){return(vec){a.x+b.x,a.y+b.y};}
    vec operator-(vec a,vec b){return(vec){a.x-b.x,a.y-b.y};}
    vec operator*(vec a,vec b){return(vec){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
    vec*getw(int n,int m){
    	static vec w[N/2];
    	w[0].x=1;
    	w[1]=(vec){cos(2*pi/n),sin(2*pi/n)};
    	for(int i=2;i<m;++i)
    		w[i]=w[i-1]*w[1];
    	return w;
    }
    void fft(vec*c,int n,int d){
    	for(int i=0,j=0;i<n;++i){
    		if(i<j)
    			swap(c[i],c[j]);
    		for(int k=n>>1;;k>>=1)
    			if((j^=k)>=k)break;
    	}
    	for(int i=1;i<n;i<<=1){
    		vec*w=getw(2*i*d,i);
    		for(int j=0;j<n;j+=i<<1){
    			vec*a=c+j,*b=a+i;
    			for(int k=0;k<i;++k){
    				vec v=w[k]*b[k];
    				b[k]=a[k]-v,a[k]=a[k]+v;
    			}
    		}
    	}
    	if(!~d)
    		for(int i=0;i<n;++i)
    			c[i].x/=n;
    }
    int main(){
    	static int n,tmp,s,s2;
    	scanf("%d%*d",&n);
    	for(int i=0;i<n;++i)
    		scanf("%d",&tmp),s+=tmp,s2+=tmp*tmp,a[i].x=tmp;
    	for(int i=n-1;~i;--i)
    		scanf("%d",&tmp),s-=tmp,s2+=tmp*tmp,b[i].x=tmp;
    	int l=4<<__lg(n);
    	fft(a,l,1);
    	fft(b,l,1);
    	for(int i=0;i<l;++i)
    		a[i]=a[i]*b[i];
    	fft(a,l,-1);
    	int s3=-1e9;
    	for(int i=0;i<n;++i)
    		s3=max(s3,int(a[i].x+a[i+n].x+.5));
    	int c=round(s/1./n);
    	printf("%d\n",s2-2*s3+c*(n*c-2*s));
    }
    
    • 1

    信息

    ID
    1020
    时间
    2000ms
    内存
    128MiB
    难度
    (无)
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者