BZOJ4827 [Hnoi2017]礼物


Solution

如果一串数的增加,不就等于另一串数减吗?

那么我们可以把答案写成另一个形式:

\(ans=\sum_{i=1}^n(x_i-y_i+C)^2\)

\(y\)可以是重新排列

那么疯狂拆一下式子,化简之后就是:

\(ans=\sum_{i=1}^nx_i^2+\sum_{i=1}^ny_i^2+\sum_{i=1}^nC^2+2*C*\sum_{i=1}^n(x_i-y_i)-2*\sum_{i=1}^nx_i*y_i​\)

如果我们枚举\(C\),那么现在的任务就是算出\(\sum_{i=1}^nx_i*y_i\)的最大值,这样才能让\(ans\)最小.

怎么做呢?

如果把\(y\)数列翻转一下,那么就是:
\(\sum_{i=1}^nx_i*y_i=\sum_{i=1}^nx_i*y_{n-i}\)

这个不就是卷积?

考虑可以逆时针旋转怎么做?断环成链就好了啊.

那么就是把\(y\)串翻转然后复制一遍,求一个卷积然后走人了.

是的结束了.

代码实现

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<math.h>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<set>
  8. #include<map>
  9. #include<iostream>
  10. using namespace std;
  11. #define ll long long
  12. #define re register
  13. #define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
  14. inline int gi()
  15. {
  16. int f=1,sum=0;char ch=getchar();
  17. while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  18. while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
  19. return f*sum;
  20. }
  21. const int N=1000010,Inf=1e9+10;
  22. const double Pi=acos(-1.0);
  23. int x[N],y[N],r[N],limit,n,m,Ans[N];
  24. struct node
  25. {
  26. double x,y;
  27. node operator+(const node b)const{return (node){x+b.x,y+b.y};}
  28. node operator-(const node b)const{return (node){x-b.x,y-b.y};}
  29. node operator*(const node b)const{return (node){x*b.x-y*b.y,x*b.y+y*b.x};}
  30. }A[N],B[N];
  31. void FFT(node *A,int type)
  32. {
  33. for(int i=0;i<limit;i++)
  34. if(i<r[i])swap(A[i],A[r[i]]);
  35. for(int mid=1;mid<limit;mid<<=1)
  36. {
  37. node Root=(node){cos(Pi/mid),type*sin(Pi/mid)};
  38. for(int R=mid<<1,j=0;j<limit;j+=R)
  39. {
  40. node Mi=(node){1,0};
  41. for(int k=0;k<mid;k++,Mi=Mi*Root)
  42. {
  43. node X=A[j+k],Y=Mi*A[j+mid+k];
  44. A[j+k]=X+Y;
  45. A[j+mid+k]=X-Y;
  46. }
  47. }
  48. }
  49. }
  50. void init()
  51. {
  52. limit=1;int l=0;
  53. for(int i=0;i<n;i++)A[i].x=x[i+1];
  54. for(int i=0;i<n;i++)B[i].x=y[n-i];
  55. for(int i=0;i<n;i++)B[i+n]=B[i];
  56. int M=n+n-1,N=n-1;
  57. while(limit<=(N+M))limit<<=1,l++;
  58. for(int i=0;i<limit;i++)
  59. r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
  60. FFT(A,1);FFT(B,1);
  61. for(int i=0;i<limit;i++)A[i]=A[i]*B[i];
  62. FFT(A,-1);
  63. for(int i=0;i<limit;i++)
  64. Ans[i]=(int)(A[i].x/limit+0.5);
  65. }
  66. int main()
  67. {
  68. n=gi();m=gi();
  69. for(int i=1;i<=n;i++)x[i]=gi();
  70. for(int i=1;i<=n;i++)y[i]=gi();
  71. int pf1=0,pf2=0,sum1=0,sum2=0,ans=Inf;
  72. for(int i=1;i<=n;i++)pf1=pf1+x[i]*x[i];
  73. for(int i=1;i<=n;i++)pf2=pf2+y[i]*y[i];
  74. for(int i=1;i<=n;i++)sum1+=x[i];
  75. for(int i=1;i<=n;i++)sum2+=y[i];
  76. init();int Max=-Inf;
  77. for(int i=n-1;i<n+n;i++)Max=max(Max,Ans[i]);
  78. for(int C=-m;C<=m;C++)
  79. {
  80. int tot=pf1+pf2+C*C*n-2*Max+2*(sum1-sum2)*C;
  81. ans=min(ans,tot);
  82. }
  83. printf("%d\n",ans);
  84. return 0;
  85. }

【BZOJ4827】 [Hnoi2017]礼物的更多相关文章

  1. [bzoj4827][Hnoi2017]礼物_FFT

    礼物 bzoj-4827 Hnoi-2017 题目大意:给定两个长度为$n$的手环,第一个手环上的$n$个权值为$x_i$,第二个为$y_i$.现在我可以同时将所有的$x_i$同时加上自然数$c$.我 ...

  2. [BZOJ4827][Hnoi2017]礼物(FFT)

    4827: [Hnoi2017]礼物 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1315  Solved: 915[Submit][Status] ...

  3. BZOJ4827 [Hnoi2017]礼物 多项式 FFT

    原文链接http://www.cnblogs.com/zhouzhendong/p/8823962.html 题目传送门 - BZOJ4827 题意 有两个长为$n$的序列$x$和$y$,序列$x,y ...

  4. bzoj4827 [Hnoi2017]礼物

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

  5. bzoj千题计划303:bzoj4827: [Hnoi2017]礼物

    https://www.lydsy.com/JudgeOnline/problem.php?id=4827 式子化简一下,发现最后只跟 Σ xi*yi 有关 第二个序列反转,就可以用FFT优化 注意: ...

  6. 2018.11.16 bzoj4827: [Hnoi2017]礼物(ntt)

    传送门 nttnttntt 入门题. 考虑展开要求的式子∑i=0n−1(xi−yi−c)2\sum_{i=0}^{n-1}(x_i-y_i-c)^2∑i=0n−1​(xi​−yi​−c)2 => ...

  7. BZOJ4827: [Hnoi2017]礼物(FFT 二次函数)

    题意 题目链接 Sol 越来越菜了..裸的FFT写了1h.. 思路比较简单,直接把 \(\sum (x_i - y_i + c)^2\) 拆开 发现能提出一坨东西,然后与c有关的部分是关于C的二次函数 ...

  8. BZOJ4827:[HNOI2017]礼物(FFT)

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

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

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

随机推荐

  1. 学习第一天-JAVA

    第一题打印1到1000的奇数 public class OneToThousandOdd{ public static void main(String[] args) { short num = 1 ...

  2. python中的open( )函数

    函数原型 open(file, mode=‘r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True) buff ...

  3. 使用yarn 安装 Vue-DevTools

    1. 从 github 下载 vuejs/vue-devtools https://github.com/vuejs/vue-devtools/archive/dev.zip 2.安装yarn 及 编 ...

  4. 【算法】BFS+哈希解决八数码问题

    15拼图已经有超过100年; 即使你不叫这个名字知道的话,你已经看到了.它被构造成具有15滑动砖,每一个从1到15上,并且所有包装成4乘4帧与一个瓦块丢失.让我们把丢失的瓷砖“X”; 拼图的目的是安排 ...

  5. springMVC学习 六 跳转方式

    SpringMVC的controller中的方法执行完之后,默认的跳转方式是请求转发 如果想要修改跳转方式,可以设置返回值字符串内容(1) 添加 redirect:资源路径 重定向 "red ...

  6. 经典矩阵快速幂之一-----poj3233(矩阵套矩阵

    题意:给你一个矩阵A,求S=A+A^2+A^3+...+A^k. 其实这个当时我看着毫无头绪,看了他们给的矩阵发现好!精!妙! 我们这样看 是不是有点思路! 没错!就是右上角,我们以此类推可以得到A+ ...

  7. php结合layui实现前台加后台操作

    一:前台加载出前端页面: HTML: lay-data="{width:800,height:400, url:'data.php', page:true, id:'test'} js: l ...

  8. vue 开发系列(四) vue 使用外部JS

    概要 在开发时我们会经常需要使用到外部的JS,这样我们需要引入外部js,然后进行使用. 实现方法 我们在开发的过程中需要使用到 sha256 将用户的密码进行加密传输. 我们对js进行一点点改造. f ...

  9. 删除一直处于deleting状态的数据卷

    一.场景 有一个volume数据卷hzb-1G-xxxxxx创建在nc8的ceph节点上,并且该数据卷的但是有一天nc8节点坏掉了.当我们删除hzb-1G-xxxxxx的时候,就会一直处于deleti ...

  10. C++ cout

    cout.flush() cout.put() 输出一个字符 char* p = "hello"; cout.write(p,sttrlen(q)-3) 输出字符串,能够选定长度. ...