题目大意:

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

思路:

可以看一下可以不可以把式子拆开。

∑i=1n(xi−yi+c)2=∑i=1nx2i+y2i+c2+2c(xi−yi)−2xy=∑i=1n(x2i+y2i)+2c∑i=1n(xi−yi)+nc2−∑i=1n2xiyi∑i=1n(xi−yi+c)2=∑i=1nxi2+yi2+c2+2c(xi−yi)−2xy=∑i=1n(xi2+yi2)+2c∑i=1n(xi−yi)+nc2−∑i=1n2xiyi

\sum_{i=1}^{n}(x_i-y_i+c)^2\\=\sum_{i=1}^{n}x_i^2+y_i^2+c^2+2c(x_i-y_i)-2xy\\=\sum_{i=1}^{n}(x_i^2+y_i^2)+2c\sum_{i=1}^{n}(x_i-y_i)+nc^2-\sum_{i=1}^{n}2x_iy_i
只需要独立地对每一个部分求解最优解即可。
第一部分是定值,第二部分可以用二次函数的最值来做。
第三部分不难发现可以 n2n2n^2枚举其中一个环的排列情况后计算答案。考虑把一段环拆开并且复制成两份,我们发现环在不断移动的过程就是每一个下标不断加1的过程。两个数组中的下标的差为定值,于是一个经典的做法就是把其中一个数组反转,反转之后就会变成和为定值,这也就刚好是满足多项式乘法的系数表示,直接FFT计算即可。

#include<bits/stdc++.h>#define REP(i,a,b) for(int i=a,i##_end_=b;i<=i##_end_;++i)
#define DREP(i,a,b) for(int i=a,i##_end_=b;i>=i##_end_;--i)using namespace std;void File(){freopen("bzoj4827.in","r",stdin);freopen("bzoj4827.out","w",stdout);
}const double pi=acos(-1.0);
const int maxn=50000+10;
const int inf=0x3f3f3f3f;
int n,m,lim=1,dn[maxn<<3],cnt,ans=0,sum,sum0;struct Complex{double x,y;Complex(double xx=0,double yy=0){x=xx,y=yy;}
};
Complex operator + (Complex a,Complex b){return (Complex){a.x+b.x,a.y+b.y};}
Complex operator - (Complex a,Complex b){return (Complex){a.x-b.x,a.y-b.y};}
Complex operator * (Complex a,Complex b){return (Complex){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
Complex a[maxn<<3],b[maxn<<3];void fft(Complex *A,int ty){REP(i,0,lim-1)if(i<dn[i])swap(A[i],A[dn[i]]);for(int len=1;len<lim;len<<=1){Complex w(cos(2.0*pi/(len<<1)),ty*sin(2.0*pi/(len<<1)));for(int L=0;L<lim;L+=len<<1){Complex wk(1,0);REP(i,L,L+len-1){Complex u=A[i],v=wk*A[i+len];A[i]=u+v;A[i+len]=u-v;wk=wk*w;}}}
}int main(){File();scanf("%d%d",&n,&m);int tmp;REP(i,1,n)scanf("%d",&tmp),a[n-i].x=tmp,sum+=tmp*tmp,sum0+=tmp;REP(i,1,n)scanf("%d",&tmp),b[i-1].x=b[i-1+n].x=tmp,sum+=tmp*tmp,sum0-=tmp;while(lim<=n*3-3)lim<<=1,++cnt;if(!cnt)cnt=1;REP(i,0,lim-1)dn[i]=(dn[i>>1]>>1)|((i&1)<<(cnt-1));fft(a,1);fft(b,1);REP(i,0,lim-1)a[i]=a[i]*b[i];fft(a,-1);//REP(i,0,lim-1)printf("%d\n",(int)(a[i].x/lim+0.5));REP(i,n-1,2*n-2)ans=max(ans,(int)(a[i].x/lim+0.5));int x=-sum0/n,Min=inf;Min=min(Min,n*x*x+2*sum0*x);Min=min(Min,n*(x+1)*(x+1)+2*sum0*(x+1));Min=min(Min,n*(x-1)*(x-1)+2*sum0*(x-1));ans=sum+Min-ans*2;printf("%d\n",ans);return 0;
}

[4827][Hnoi2017]礼物——FFT相关推荐

  1. bzoj 4827 [Hnoi2017]礼物——FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4827 式子就是 \sum_{i=0}^{n-1}(a[ i ] - b[ i+k ] + c ...

  2. BZOJ 4827 [Hnoi2017]礼物 ——FFT

    题目上要求一个循环卷积的最小值,直接破环成链然后FFT就可以了. 然后考虑计算的式子,可以分成两个部分分开计算. 前半部分FFT,后半部分扫一遍. #include <map> #incl ...

  3. [BZOJ 4827][Hnoi2017]礼物

    4827: [Hnoi2017]礼物 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1091  Solved: 748 [Submit][Statu ...

  4. P3723 [AH2017/HNOI2017]礼物 FFT + 式子化简

    传送门 文章目录 题意: 思路: 题意: 思路: 首先可以知道,我们对某个数组加上一个正数数的操作可以转换成对一个数组加上一个任意数,所以我们设变化量为xxx. 对于∑i=1n(ai−bi)2\sum ...

  5. bzoj4827: [Hnoi2017]礼物 FFT

    bzoj4827: [Hnoi2017]礼物 Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每个手环上各有 n ...

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

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

  7. 4827: [Hnoi2017]礼物

    首先知道旋转的一般套路就是开两倍. 然后此时发现可以把 ∑ni=1(ai−bi)2∑i=1n(ai−bi)2\sum_{i=1}^{n}(a_i-b_i)^2化作∑ni=1a2i+∑ni=1b2i−2 ...

  8. 【刷题】BZOJ 4827 [Hnoi2017]礼物

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

  9. bzoj4827[Hnoi2017]礼物 (FFT,生成函数)

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

最新文章

  1. 怎样让项目经理更受企业和团队欢迎
  2. jquery判断元素是否包含某class
  3. 通过命令行界面使用AWS ElasticMapReduce
  4. unity中创建游戏场景_在Unity中创建Beat Em Up游戏
  5. 渐进式web应用程序_通过渐进式Web应用程序吸引用户并增强他们的体验
  6. No migrations to apply.(django不能创建数据库中的表的问题)makemigrations/migrate
  7. 修改默认共享内存tmpfs大小
  8. STUCTS LABLE ‘S BENEFIT
  9. VS中一点正则表达式使用心得
  10. python timedelta_Python使用笔记:时间的运算timedelta
  11. 应用数学软件测试题,数学与应用数学专业试题.doc
  12. 微信测试是否被删软件,检测微信好友是否把你删除的3种方法,最后一种最好用!...
  13. 初探可视化新秀PyG2Plot
  14. 计算机操作系统的主要功能
  15. 麦肯锡著名的三大结构化工具:金字塔原理、MECE和逻辑树
  16. 前端剑法第四式————御风
  17. 从实战经验来看 究竟如何才能做出赚钱的量化投资策略?
  18. Android Google AdMob 广告接入配置示例
  19. vue实现斑马线进度条
  20. emacs打造开发环境

热门文章

  1. 微信 android 平台 应用签名错误,IOS微信上Vue单页面应用JSSDK签名失败解决方案
  2. 为什么ps图片打开是色块_ps怎么画功能分区色块
  3. matlab 高斯脉冲整形,matlab高斯脉冲波形
  4. 利用xcode4对itouch截图
  5. Python输入(一维数组、字符串、二维数组、三维数组等)程序
  6. 使用React-Router时出现的错误
  7. 美图手机权限开启方法
  8. 忘记密码?不存在的, 教你如何使用python 暴力破解
  9. 利用交换机命令查看IP地址对应连接的端口
  10. 设置网址导航为首页原来也可以赚点零花钱