传送门

解题思路

  首先我们设变化量为\(r\),那么最终的答案就可以写成 :

\[ans=min(\sum\limits_{i=1}^n(a_i-b_i+r)^2)
\]

\[ans=min(\sum\limits_{i=1}^n(a_i-b_i)^2-2*r*\sum\limits_{i=1}^{n}(a_i-b_i)+n*r^2)
\]

继续化简:

\[ans=min(\sum\limits_{i=1}^n a_i^2+\sum\limits_{i=1}^n b_i^2-2*\sum\limits_{i=1}^na_i*b_i-2*r*\sum\limits_{i=1}^{n}(a_i-b_i)+n*r^2)
\]

\[ans=min((\sum\limits_{i=1}^n a_i^2+\sum\limits_{i=1}^n b_i^2)-(2*r*\sum\limits_{i=1}^{n}(a_i-b_i)+n*r^2)-(2*\sum\limits_{i=1}^na_i*b_i))
\]

这样我们就可以发现,第一部分是一个定值,第二部分只需要从\(-m\)到\(m\)枚举一下\(r\)就能算出,现在问题就是算第三部分。发现第三部分形式特别像卷积,就直接将\(a\)数组翻一下倍,表示旋转,\(b\)数字翻转一下。然后\(fft\)后算一个最大值即可。

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. using namespace std;
  7. const int MAXN = 50005<<3;
  8. const double Pi=acos(-1);
  9. typedef long long LL;
  10. inline int rd(){
  11. int x=0,f=1;char ch=getchar();
  12. while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
  13. while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
  14. return f?x:-x;
  15. }
  16. int n,m,limit=1,rev[MAXN];
  17. LL ans,sqA,sqB,A,B,Sum=1e18;
  18. struct Complex{
  19. double x,y;
  20. Complex(double xx=0,double yy=0) {x=xx;y=yy;}
  21. }a[MAXN],b[MAXN];
  22. Complex operator +(const Complex A,const Complex B) {return Complex(A.x+B.x,A.y+B.y);}
  23. Complex operator -(const Complex A,const Complex B) {return Complex(A.x-B.x,A.y-B.y);}
  24. 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);}
  25. inline void fft(Complex *f,int type){
  26. for(int i=0;i<limit;i++)
  27. if(i<rev[i]) swap(f[i],f[rev[i]]);
  28. int len;Complex Wn,w,tmp;
  29. for(int p=2;p<=limit;p<<=1){
  30. len=p>>1;Wn=Complex(cos(Pi/len),type*sin(Pi/len));
  31. for(int k=0;k<limit;k+=p){
  32. w=Complex(1,0);
  33. for(int l=k;l<k+len;l++){
  34. tmp=f[l+len]*w;
  35. f[l+len]=f[l]-tmp;f[l]=f[l]+tmp;
  36. w=w*Wn;
  37. }
  38. }
  39. }
  40. }
  41. int main(){
  42. n=rd(),m=rd();int x;
  43. for(int i=1;i<=n;i++) {
  44. x=rd();sqA+=x*x;A+=x;a[i].x=(double)x;
  45. }
  46. for(int i=1;i<=n;i++) {
  47. x=rd();sqB+=x*x;B+=x;b[n-i+1].x=(double)x;
  48. }
  49. for(int i=1;i<=n;i++) a[i+n].x=a[i].x;
  50. while(limit<=3*n) limit<<=1;
  51. for(int i=0;i<limit;i++) rev[i]=(rev[i>>1]>>1)|((i&1)?limit>>1:0);
  52. fft(a,1);fft(b,1);for(int i=0;i<limit;i++) a[i]=a[i]*b[i];fft(a,-1);
  53. for(int i=n+1;i<=n*2;i++) ans=max(ans,(LL)(a[i].x/limit+0.5));
  54. ans<<=1;ans=-ans;
  55. for(int i=-m;i<=m;i++) Sum=min(Sum,(LL)(A-B)*2*i+(LL)n*i*i);
  56. ans+=Sum+sqA+sqB;cout<<ans<<endl;
  57. return 0;
  58. }

LUOGU P3723 [AH2017/HNOI2017]礼物 (fft)的更多相关文章

  1. [Luogu P3723] [AH2017/HNOI2017]礼物 (FFT 卷积)

    题面 传送门:洛咕 Solution 调得我头大,我好菜啊 好吧,我们来颓柿子吧: 我们可以只旋转其中一个手环.对于亮度的问题,因为可以在两个串上增加亮度,我们也可以看做是可以为负数的. 所以说,我们 ...

  2. 洛谷 P3723 [AH2017/HNOI2017]礼物 解题报告

    P3723 [AH2017/HNOI2017]礼物 题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个 ...

  3. P3723 [AH2017/HNOI2017]礼物

    题目链接:[AH2017/HNOI2017]礼物 题意: 两个环x, y 长度都为n k可取 0 ~ n - 1      c可取任意值 求 ∑ ( x[i] - y[(i + k) % n + 1] ...

  4. 洛谷P3723 [AH2017/HNOI2017]礼物(FFT)

    传送门 首先,两个数同时增加自然数值相当于只有其中一个数增加(此增加量可以小于0) 我们令$x$为当前的增加量,${a},{b}$分别为旋转后的两个数列,那么$$ans=\sum_{i=1}^n(a_ ...

  5. [AH2017/HNOI2017]礼物(FFT)

    题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在她生日的前一 ...

  6. Luogu 3723 [AH2017/HNOI2017]礼物

    BZOJ 4827 $$\sum_{i = 1}^{n}(x_i - y_i + c)^2 = \sum_{i = 1}^{n}(x_i^2 + y_i^2 + c^2 - 2 * x_iy_i + ...

  7. 洛谷P3723 [AH2017/HNOI2017]礼物

    吴迪说他化学会考上十分钟就想出来了,太神了%%%不过我也十分钟 但是调了一个多小时啊大草 懒得人话翻译了,自己康吧: 我的室友(真的是室友吗?)最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决 ...

  8. 笔记-[AH2017/HNOI2017]礼物

    笔记-[AH2017/HNOI2017]礼物 [AH2017/HNOI2017]礼物 \[\begin{split} ans_i=&\sum_{j=1}^n(a_j-b_j+i)^2\\ =& ...

  9. bzoj 4827: [Hnoi2017]礼物 [fft]

    4827: [Hnoi2017]礼物 题意:略 以前做的了 化一化式子就是一个卷积和一些常数项 我记着确定调整值还要求一下导... #include <iostream> #include ...

随机推荐

  1. API equals方法 toString方法

    API  API: Application(应用) Programming(程序) Interface(接口)  不需要关心这些类是如何实现的,只需要学习这些类如何使用即可. equals方法 1.在 ...

  2. CentOS7用rpmforge源!

    确认系统是否安装了priority这个yum的插件,这个插件用来保证安装软件时候软件仓库先后次序,一般是默认先从官方base或者镜像安装,然后从社区用户contribute的软件中安装,再从第三方软件 ...

  3. mongdb 备份还原导入导出

    -------------------MongoDB数据导入与导出------------------- 1.导出工具:mongoexport     1.概念:         mongoDB中的m ...

  4. dubbo入门学习(一)-----分布式基础理论、架构发展以及rpc、dubbo核心概念

    一.分布式基础理论 1.什么是分布式系统? <分布式系统原理与范型>定义: “分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统” 分布式系统(distributed ...

  5. Linux知识总结(更新中)

    Linux知识总结(更新中) 如何查找特定的文件 find find path [options] params 作用:在指定目录下查找文件 检索文件内容 grep grep [options] pa ...

  6. Installing GCC 简单方法

    Installing GCC This page is intended to offer guidance to avoid some common problems when installing ...

  7. jquery中的ajax方法参数的用法和他的含义

    jquery中的ajax方法参数的用法和他的含义: 1.url:  要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type:  要求为String类型的参数,请求方式(pos ...

  8. 20140724 菜单制作:制表位(段落->制表位->)

    1.菜单制作:制表位(段落->制表位->) 叶轩楠·········· 上海大学 轩楠叶·········· 上海大学 楠轩叶·········· 上海大学 选完后要选“设置” 2.光盘制 ...

  9. angularJS 上传multipart/form-data

    var fd = new FormData();fd.append('file', vm.file);CommodityViewImport.post(fd, onSaveSuccess, onSav ...

  10. python读取文件报错:pandas.errors.ParserError: iterator should return strings, not bytes (did you open the file in text mode?)

    python 读取csv文件报错问题 import csv with open('E:/Selenium2script/DDT模块/test.csv','rb') as f: readers = cs ...