题目描述

我的室友最近喜欢上了一个可爱的小女生。马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一
个送给她。每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度。但是在她生日的前一天,我的室友突
然发现他好像拿错了一个手环,而且已经没时间去更换它了!他只能使用一种特殊的方法,将其中一个手环中所有
装饰物的亮度增加一个相同的自然数 c(即非负整数)。并且由于这个手环是一个圆,可以以任意的角度旋转它,
但是由于上面 装饰物的方向是固定的,所以手环不能翻转。需要在经过亮度改造和旋转之后,使得两个手环的差
异值最小。在将两个手环旋转且装饰物对齐了之后,从对齐的某个位置开始逆时针方向对装饰物编号 1,2,…,n,
其中 n 为每个手环的装饰物个数,第 1 个手环的 i 号位置装饰物亮度为 xi,第 2 个手 环的 i 号位置装饰物
亮度为 yi,两个手环之间的差异值为(参见输入输出样例和样例解释): ∑(xi-yi)2麻烦你帮他
计算一下,进行调整(亮度改造和旋转),使得两个手环之间的差异值最小, 这个最小值是多少呢?
题解
这道题作为FFT的例题还是比较简单的。
一开始我还naive的以为m比较小,可以枚举c的值。
其实如果把平方展开后可以发现我们的轮换和c没有关系。
所以就把a数组reverse一下,做一遍FFT,统计答案就好了。
至于c的值,我感觉暴力枚举就可以,但其实我们也可以根据二次函数的对称轴来算。
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#define N 200002
using namespace std;
typedef long long ll;
const double pai=acos(-1.0);
ll ans,sum,sum2,l,L,c[N];
int rev[N],n,m;
inline ll rd(){ll x=0;char c=getchar();bool f=0;while(!isdigit(c)){if(c=='-')f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return f?-x:x;
}
struct fs{double x,y;fs(){x=y=0;}fs(double xx,double yy){x=xx;y=yy;}fs operator +(const fs &b)const{return fs{x+b.x,y+b.y};}fs operator -(const fs &b)const{return fs{x-b.x,y-b.y};}fs operator *(const fs &b)const{return fs{x*b.x-y*b.y,x*b.y+y*b.x};}
}a[N],b[N];
inline void FFT(fs *a,int tag){for(int i=0;i<l;++i)if(i>rev[i])swap(a[i],a[rev[i]]);for(int i=1;i<l;i<<=1){fs wn(cos(pai/i),tag*sin(pai/i));for(int j=0;j<l;j+=(i<<1)){fs w(1,0); for(int k=0;k<i;++k,w=w*wn){fs x=a[j+k],y=w*a[i+j+k];a[j+k]=x+y;a[i+j+k]=x-y;}} }
}
int main(){n=rd();m=rd();for(int i=1;i<=n;++i)a[n-i+1].x=rd();for(int i=1;i<=n;++i){b[i].x=rd();sum+=a[i].x*a[i].x+b[i].x*b[i].x;sum2+=a[i].x-b[i].x;}l=1;L=0;while(l<(n<<1))l<<=1,L++;for(int i=1;i<l;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));FFT(a,1);FFT(b,1);for(int i=0;i<l;++i)a[i]=a[i]*b[i];FFT(a,-1);for(int i=0;i<l;++i)a[i].x=(ll)(a[i].x/l+0.1);for(int i=1;i<=n;++i)a[i+n].x+=a[i].x;for(int i=n+1;i<=n<<1;++i){ans=max(ans,(ll)a[i].x);}ll x=1e18;for(int i=sum2/n-6;i<=sum2/n+6;++i)x=min(x,n*i*i+2*i*sum2);printf("%lld",sum-2*ans+x);return 0;
}

转载于:https://www.cnblogs.com/ZH-comld/p/10257433.html

[AH2017/HNOI2017]礼物(FFT)相关推荐

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

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

  2. (每日一题)P3723 [AH2017/HNOI2017]礼物(经典FFT)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.15 多项式 FFT Problem ...

  3. P3723 [AH2017/HNOI2017]礼物(FFT)

    P3723 [AH2017/HNOI2017]礼物 式子化简 ∑i=1n(xi−yj)2\sum_{i = 1} ^{n} (x_i- y_j) ^2\\ i=1∑n​(xi​−yj​)2 我们对第一 ...

  4. AH2017/HNOI2017 礼物

    P3723 [AH2017/HNOI2017]礼物 题目大意 给两个数列 a a a和 b b b, a a a和 b b b中的数都小于等于 m m m, b b b可以首尾相接地旋转,要选择一个整 ...

  5. bzoj4827: [Hnoi2017]礼物 FFT

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

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

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

  7. 【bzoj4827】[AH2017/HNOI2017]礼物(FFT)

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

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

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

  9. [AH2017/HNOI2017]礼物

    题意: 两个数列,每个数列都可以顺序旋转,也可以对所有数同时增加一个非负整数,现在问 的最小值 题解: 在求卷积前要将A数组倍长,B数组翻转 B数组翻转好理解,为什么A数组倍长,因为题目的数列是可以移 ...

最新文章

  1. 《评人工智能如何走向新阶段》后记(再续2)
  2. 云计算和大数据时代网络技术揭秘(六)LISP协议
  3. BeautifulSoup的高级应用 之 contents children descendants string strings stripped_strings
  4. 简述python中怎样导入模块_12 python中模块和包如何导入
  5. linux lib64被改名,问题解决:Centos误将/lib64更改为lib64.bak
  6. mybatis insert返回主键_MyBatis官方文档XML 映射文件
  7. Hi3559av100安装linux,海思hi3559AV100开发板参数规格介绍
  8. 简单的HTML5灰度图查看器 simple PACS DICOM HTML5 viewer
  9. Caffe各版本与源码全透析
  10. 土地利用转移矩阵图怎么做_土地利用转移矩阵的几种实现方法
  11. 白噪声的matlab程序,matlab产生白噪声信号
  12. 计算机专业表情包图片,各个专业表情包盘点 | 你的专业也有自己专属表情包吗?...
  13. Git 合并单个文件
  14. 强连通分量(Tarjan算法)和缩点
  15. 计算机毕业设计 SSM+Vue宠物管理系统 宠物商城 宠物用品购物平台 宠物领养救助系统 Java Vue MySQL数据库 远程调试 代码讲解
  16. QTableWidget中如何清空行,并保持行仍可再写入数据
  17. hive表信息查询:查看表结构、表操作等(转)
  18. Saruman's Army (POJ3069)
  19. 决策树(Decision Tree)算法 python简单实现
  20. 64位和32位有什么区别?到底哪个更快?——硬核科普

热门文章

  1. 全球及中国煤层气开发产业运营规模与十四五战略决策建议报告2022版
  2. 全球及中国医用腋拐行业竞争格局及供需前景预测报告2021年版
  3. python模块之collections模块
  4. jira webhook 事件触发并程序代码调用jenkins接口触发构建操作
  5. 怎样将python的文件转化为windows的可执行程序
  6. Ribbon_窗体_实现Ribbon风格的窗体
  7. 优化JVM参数提升Eclipse运行速度
  8. Fbpanel-轻巧的面板措施
  9. 捕获SocketConnection组件连接异常的几个好贴
  10. 用于弹出ModalDialog进行数据选择的控件