4827: [Hnoi2017]礼物

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 1315  Solved: 915
[Submit][Status][Discuss]

Description

我的室友最近喜欢上了一个可爱的小女生。马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一
个送给她。每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度。但是在她生日的前一天,我的室友突
然发现他好像拿错了一个手环,而且已经没时间去更换它了!他只能使用一种特殊的方法,将其中一个手环中所有
装饰物的亮度增加一个相同的自然数 c(即非负整数)。并且由于这个手环是一个圆,可以以任意的角度旋转它,
但是由于上面 装饰物的方向是固定的,所以手环不能翻转。需要在经过亮度改造和旋转之后,使得两个手环的差
异值最小。在将两个手环旋转且装饰物对齐了之后,从对齐的某个位置开始逆时针方向对装饰物编号 1,2,…,n,
其中 n 为每个手环的装饰物个数,第 1 个手环的 i 号位置装饰物亮度为 xi,第 2 个手 环的 i 号位置装饰物
亮度为 yi,两个手环之间的差异值为(参见输入输出样例和样例解释): \sum_{i=1}^{n}(x_i-y_i)^2麻烦你帮他
计算一下,进行调整(亮度改造和旋转),使得两个手环之间的差异值最小, 这个最小值是多少呢?

Input

输入数据的第一行有两个数n, m,代表每条手环的装饰物的数量为n,每个装饰物的初始 亮度小于等于m。
接下来两行,每行各有n个数,分别代表第一条手环和第二条手环上从某个位置开始逆时 针方向上各装饰物的亮度。
1≤n≤50000, 1≤m≤100, 1≤ai≤m

Output

输出一个数,表示两个手环能产生的最小差异值。
注意在将手环改造之后,装饰物的亮度 可以大于 m。

Sample Input

5 6
1 2 3 4 5
6 3 3 4 5

Sample Output

1
【样例解释】
需要将第一个手环的亮度增加1,第一个手环的亮度变为: 2 3 4 5 6 旋转一下第二个手环。对于该样例,是将第
二个手环的亮度6 3 3 4 5向左循环移动 2017-04-15 第 6 页,共 6 页 一个位置,使得第二手环的最终的亮度为
:3 3 4 5 6。 此时两个手环的亮度差异值为1。

HINT

Source

Solution

  由于是多项式第一题所以抄的yyb的题解(说的像我后面就能自己做一样。。。)

  为了方便,我们从0开始编号,然后答案就是下面这个式子

  \[{\mathop{ \sum }\limits_{{i=0}}^{{n-1}}{\mathop{{{ \left( {\mathop{{x}}\nolimits_{{i}}\mathop{{-y}}\nolimits_{{i+k}}+c} \right) }}}\nolimits^{{2}}}}\]

  其中${c}$的取值范围为${ \left[ {-m,m} \right] }$,因为一旦超过这个范围,$c+{\mathop{{y}}\nolimits_{{i}}}$的绝对值一定大于${\mathop{{x}}\nolimits_{{i}}}$的绝对值,这样把$c$+1或-1一定能使答案更小。

  把答案式子拆开:

  \[{{ \sum {\mathop{{\mathop{{x}}\nolimits_{{i}}}}\nolimits^{{2}}}}+{ \sum {\mathop{{\mathop{{y}}\nolimits_{{i}}}}\nolimits^{{2}}}-{2 \sum {\mathop{{x}}\nolimits_{{i\text{ }}}\mathop{{y}}\nolimits_{{i+k}}}+n\mathop{{c}}\nolimits^{{2}}+}}2c \left( { \sum {\mathop{{x}}\nolimits_{{i}}}-{ \sum {\mathop{{y}}\nolimits_{{i}}}}} \right) }\]

  c可以枚举,所以除了${ \sum {\mathop{{x}}\nolimits_{{i\text{ }}}\mathop{{y}}\nolimits_{{i+k}}}}$都算常数项了,接下来考虑如何最大化${ \sum {\mathop{{x}}\nolimits_{{i\text{ }}}\mathop{{y}}\nolimits_{{i+k}}}}$

  显然不能n^2暴力乘。我们把$x$看成一个多项式,把$y$ reverse一下,也看成一个多项式,然后做卷积,发现卷积后第n-1项的系数恰好就是${ \sum {\mathop{{x}}\nolimits_{{i\text{ }}}\mathop{{y}}\nolimits_{{i}}}}$。

  解法呼之欲出:把$y$(reverse后的)复制一遍接在后面,然后跟$x$做卷积,那么卷积后第n-1+k项的系数就是${ \sum {\mathop{{x}}\nolimits_{{i\text{ }}}\mathop{{y}}\nolimits_{{i+k}}}}$。

  //公式编辑得好累……

Code

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=<<;
  4. const double pi=acos(-1.0);
  5. inline int read(){
  6. int x=,w=;char ch=;
  7. while(!isdigit(ch)) w|=ch=='-',ch=getchar();
  8. while(isdigit(ch)) x=(x<<)+(x<<)+(ch^),ch=getchar();
  9. return w?-x:x;
  10. }
  11. struct cp{
  12. double x,y;
  13. cp(double xx=,double yy=):x(xx),y(yy){};
  14. cp operator + (const cp &tmp)const{return cp(x+tmp.x,y+tmp.y);}
  15. cp operator - (const cp &tmp)const{return cp(x-tmp.x,y-tmp.y);}
  16. cp operator * (const cp &tmp)const{return cp(x*tmp.x-y*tmp.y,x*tmp.y+y*tmp.x);}
  17. };
  18. int n,m,ans,ss,sa[N],sb[N],rev[N],res[N];
  19. cp a[N],b[N];
  20. void fft(int n,cp a[],int fg){
  21. for(int i=;i<n;++i) if(i<rev[i]) swap(a[i],a[rev[i]]);
  22. for(int m=,len=m<<;m<n;m<<=,len<<=){
  23. cp I=cp(cos(pi/m),fg*sin(pi/m));
  24. for(int i=;i<n;i+=len){
  25. cp w=cp(,),t;
  26. for(int j=;j<m;++j,w=w*I)
  27. t=a[i+j+m]*w,
  28. a[i+j+m]=a[i+j]-t,
  29. a[i+j]=a[i+j]+t;
  30. }
  31. }
  32. }
  33. void pre(){
  34. for(int i=;i<n;++i) a[i].x=sa[i+],b[i].x=b[i+n].x=sb[n-i];
  35. int lim=,l=;
  36. while(lim<=(n*-)) lim<<=,++l;
  37. for(int i=;i<lim;++i) rev[i]=(rev[i>>]>>)|((i&)<<(l-));
  38. fft(lim,a,),fft(lim,b,);
  39. for(int i=;i<lim;++i) a[i]=a[i]*b[i];
  40. fft(lim,a,-);
  41. for(int i=;i<lim;++i)
  42. res[i]=(int)(a[i].x/lim+0.5);
  43. }
  44. int main(){
  45. n=read(),m=read();
  46. for(int i=;i<=n;++i){
  47. sa[i]=read();
  48. ans+=sa[i]*sa[i];
  49. ss+=sa[i];
  50. }
  51. for(int i=;i<=n;++i){
  52. sb[i]=read();
  53. ans+=sb[i]*sb[i];
  54. ss-=sb[i];
  55. }
  56. pre();
  57. int tmp=;
  58. for(int k=;k<n;++k) tmp=max(tmp,res[n-+k]);
  59. ans-=(tmp<<);tmp=0x3f3f3f3f;
  60. for(int c=-m;c<=m;++c) tmp=min(tmp,n*c*c+*c*ss);
  61. cout<<ans+tmp<<endl;
  62. return ;
  63. }

BZOJ4827

[BZOJ4827][Hnoi2017]礼物(FFT)的更多相关文章

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

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

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

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

  3. [bzoj4827][Hnoi2017]礼物_FFT

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

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

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

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

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

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

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

  7. 【bzoj4827】[Hnoi2017]礼物 FFT

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

  8. bzoj4827 [Hnoi2017]礼物

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

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

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

随机推荐

  1. Winform_chart控件_心得

    效果图: 1.首先,在工具箱找到chart控件,拖到窗体中. 2.关于chart控件的细节设计: series集合设计: chartType可以选择折线图.柱状图.圆饼图等等. isValueShow ...

  2. HttpWorkerRequest应用简介

    1. Using HttpWorkerRequest for getting headers1.使用HttpWorkerRequest获取headers信息 First, the HttpWorker ...

  3. 【JavaScript】js中的构造函数,和构造函数的实例中的原型详解

    1. 构造函数作为一个对象,他也有他的原型属性,即.prototype:该属性指向的原型对象是Object. 2. 而构造函数产生的实例却没有.prototype属性,但是作为一个对象,该实例却仍然拥 ...

  4. js div模拟水平滚动条

    这个也是我百度到的,但是忘记保存连接了,现在把代码贴上来,有需要的可以参考一下: <!DOCTYPE html> <html> <head> <meta ch ...

  5. 图片上传(3)(组件 -- 图片大小宽高限制)base64图片宽高读取

    1.上传组件(可上传多个文件) <template> <div class="attachmentN"> <span class="btnS ...

  6. java_day09_GUI事件

    第九章:GUI事件 1.AWT事件模型概述 使用AWT或者Swing中的容器.组件和布局管理器就可以构建出图形界面,但是这时候该界面还并不能和用户进行交换,因为图形界面中的组件还没有添加事件监听器,所 ...

  7. head pose estimation

    opencv:帖子中介绍了算法原理和opencv估计姿态的代码 https://www.learnopencv.com/head-pose-estimation-using-opencv-and-dl ...

  8. 20、linux启动流程和救援模式

    1.Linux启动流程 2.Linux运行级别 1.什么是运行级别,运行级别就是操作系统当前正在运行的功能级别 System V init运行级别 systemd目标名称 作用 0 runlevel0 ...

  9. /proc/filesystems各字段含义

    /proc/filesystems A text listing of the filesystems which were compiled into the kernel. Incidentall ...

  10. C++实例 分解质因数

    分解质因数: 每个合数都可以写成几个质数相乘的形式.其中每个质数都是这个合数的因数,叫做这个合数的分解质因数.分解质因数只针对合数. 分解质因数的算式叫短除法.求一个数分解质因数,要从最小的质数除起, ...