zoukankan      html  css  js  c++  java
  • bzoj4827 Hnoi2017 礼物

    题目链接

    solution

    将式子展开

    [sumlimits_{i=1}^n(x_i - y_i + c)^2 ]

    [=sumlimits_{i=1}^nx_i^2+y_i^2-2x_iy_i+2c(x_i-y_i)+c^2 ]

    [=sumlimits_{i=1}^nx_i^2+sumlimits_{i=1}^ny_i^2-2sumlimits_{i=1}^nx_iy_i+2c(sumlimits_{i=1}^nx_i-sumlimits_{i=1}^ny_i)+nc^2 ]

    前面(sumlimits_{i=1}^nx_i^2+sumlimits_{i=1}^ny_i^2)是定值。
    后面(2c(sumlimits_{i=1}^nx_i-sumlimits_{i=1}^ny_i)+nc^2)是个二次函数。最值很好求。
    所以问题就是要最大化(sumlimits_{i=1}^nx_iy_i),

    我们设将(y)这个手环左移了(k)下。那么答案就变为(sumlimits_{i=1}^nx_iy_{i+k})

    将x序列倒过来就变成了卷积的形式(sumlimits_{i=1}^nx_{n-i}y_{i+k})

    code

    /*
    * @Author: wxyww
    * @Date:   2019-07-21 20:49:19
    * @Last Modified time: 2019-07-21 21:33:06
    */
    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<ctime>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    const int N = 1000000 + 100;
    ll read() {
    	ll x=0,f=1;char c=getchar();
    	while(c<'0'||c>'9') {
    		if(c=='-') f=-1;
    		c=getchar();
    	}
    	while(c>='0'&&c<='9') {
    		x=x*10+c-'0';
    		c=getchar();
    	}
    	return x*f;
    }
    int Re[N],n,m,limit = 1;
    struct complex {
    	double x,y;
    	complex(double xx = 0,double yy = 0) {x = xx;y = yy;}
    }a[N],b[N];
    complex operator + (const complex &A,const complex &B) {
    	return complex(A.x + B.x,A.y + B.y);
    }
    complex operator - (const complex &A,const complex &B) {
    	return complex(A.x - B.x,A.y - B.y);
    }
    complex operator * (const complex &A,const complex &B) {
    	return complex(A.x * B.x - A.y * B.y,A.x * B.y + A.y * B.x);
    }
    double ans;
    double T;
    const double pi = acos(-1.0);
    void FFT(complex *A,int type) {
    	for(int i = 0;i < limit;++i) if(i < Re[i]) swap(A[i],A[Re[i]]);
    	for(int mid = 1;mid < limit;mid <<= 1) {
    		complex Wn(cos(pi / mid),type * sin(pi / mid));
    		for(int R = mid << 1,j = 0;j < limit;j += R) {
    			complex w(1.0,0);
    			for(int k = 0;k < mid;++k,w = w * Wn) {
    				complex x = A[j + k],y = w * A[j + mid + k];
    				A[j + mid + k] = x - y;
    				A[j + k] = x + y;
    			}
    		}
    	}
    }
    ll calc(ll x) {
    	return n * x * x + 2 * T * x;
    }
    int main() {
    	n = read(),m = read();
    	for(int i = 0;i < n;++i) {
    		int x = read();
    		a[n - i].x = x;
    		ans += x * x;
    		T += x;
    	}
    
    	for(int i = 0;i < n;++i) {
    		int y = read();
    		b[i].x = b[i + n].x = y;
    		ans += y * y;
    		T -= y;
    	}
    
    	int num = 0;
    	while(limit <= n * 3) limit <<= 1,num++;
    	for(int i = 0;i <= limit;++i) Re[i] = Re[i >> 1] >> 1 | ((i & 1) << (num - 1));
    
    	FFT(a,1);
    	FFT(b,1);
    	for(int i = 0;i <= limit;++i) a[i] = a[i] * b[i];
    	FFT(a,-1);
    
    	double ret = 0;
    	for(int i = 0;i <= limit;++i) ret = max(ret,round(a[i].x / limit));
    
    	ans -= 2 * ret;
    	
    	ans += calc(round(-T / n));
    
    	printf("%.0lf",ans);
    
    	return 0;
    }
    
  • 相关阅读:
    mySql基础
    ECSHOP模糊分词搜索和商品列表关键字飘红功能
    smarty在循环的时候计数来显示这是第几次循环的功能
    PHP Warning: 的解决方法
    ECSHOP生成缩略图模糊
    ECSHOP商品描述和文章里不加水印,只在商品图片和商品相册加水印
    ECSHOP_百度收录网址后面有?from=rss
    在ecshop中添加页面,并且实现后台管理
    windows 2003子目录权限丢失及子目录权限无法继承更改的解决方法
    Newtonsoft.Json初探
  • 原文地址:https://www.cnblogs.com/wxyww/p/bzoj4827.html
Copyright © 2011-2022 走看看