标签:FFT


Description

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

不妨设第一个手环为S,第二个手环为T,则题意变为求∑(Si−Ti+k+C)2∑(Si−Ti+k+C)2\sum(S_i-T_{i+k}+C)^2的最小值
我们将上式展开,可以得到

∑(S2i+T2i+k+C2+2∗C(Si−Ti+k)−2∗SiTi+k)∑(Si2+Ti+k2+C2+2∗C(Si−Ti+k)−2∗SiTi+k)

\sum(S_i^2+T_{i+k}^2+C^2+2*C(S_i-T_{i+k})-2*S_iT_{i+k})
进一步得到

∑S2i+∑T2i+n∗C2+2∗c∗∑(Si−Ti)−2∗∑SiTi+k∑Si2+∑Ti2+n∗C2+2∗c∗∑(Si−Ti)−2∗∑SiTi+k

\sum S_i^2+\sum T_i^2+n*C^2+2*c*\sum(S_i-T_i)-2*\sum S_iT_{i+k}
先抛开CCC不看,我们发现只有∑SiTi+k" role="presentation" style="position: relative;">∑SiTi+k∑SiTi+k\sum S_iT_{i+k}不是常数
如何求∑SiTi+k∑SiTi+k\sum S_iT_{i+k}最大值呢?标准套路:将T数组反转,求出S与T的卷积,不难发现,∑SiTi+k∑SiTi+k\sum S_iT_{i+k}对应每一个k的取值,都是卷积中两个相差n次的项的系数之和,这里可以用FFT,将复杂度降到O(nlogn)。
求完∑SiTi+k∑SiTi+k\sum S_iT_{i+k}最大值后,我们发现只有关于C的二次项与一次项,直接用二次函数求最值的方法即可,注意C只能为整数。

/**************************************************************Problem: 4827User: P1atformLanguage: C++Result: AcceptedTime:592 msMemory:9108 kb
****************************************************************/#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#define N 200000
#define INF 1000000000
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
ll n,m,M,p=0ll,q=0ll,z=0ll,ans=INF,r[N+50],x,l;
struct com
{double x,y;inline com operator +(com b){com ret;ret.x=x+b.x,ret.y=y+b.y;return ret;}inline com operator -(com b){com ret;ret.x=x-b.x,ret.y=y-b.y;return ret;}inline com operator *(com b){com ret;ret.x=x*b.x-y*b.y,ret.y=x*b.y+y*b.x;return ret;}
}s[N+50],t[N+50];
template<class _T> inline void read(_T &x)
{x=0;char ch=getchar();int f=0;while (!isdigit(ch)) {if (ch=='-') f=1;ch=getchar();}while (isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar();if (f) x=-x;
}
inline void fft(com a[],int k)
{for (int i=1;i<n;i++) if (i<r[i]) swap(a[i],a[r[i]]);for (int i=1;i<n;i<<=1){com w,wn,X,Y;wn.x=cos(pi/i),wn.y=k*sin(pi/i);for (int j=0;j<n;j+=(i<<1)){w.x=1,w.y=0;for (int _=0;_<i;_++,w=w*wn){X=a[j+_],Y=w*a[j+_+i];a[j+_]=X+Y,a[j+_+i]=X-Y;}} }if (k==-1) for (int i=0;i<n;i++) a[i].x/=n;
}
int main()
{read(n),n--,read(M),memset(s,0,sizeof(s)),memset(t,0,sizeof(t));for (int i=0;i<=n;i++) read(x),p+=x*x,q+=x,s[i].x=x;for (int i=0;i<=n;i++) read(x),p+=x*x,q-=x,t[n-i].x=x;for (m=2*n,n=1;n<=m;n<<=1) l++;for (int i=1;i<n;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));fft(s,1),fft(t,1);for (int i=0;i<=n;i++) s[i]=s[i]*t[i];fft(s,-1),n=m/2,z=(ll)(s[n].x+0.5);for (int i=1;i<=n;i++) z=max(z,(ll)(s[i-1].x+0.5)+(ll)(s[i+n].x+0.5));for (int i=-M;i<=M;i++) ans=min(ans,p-2*z+i*((n+1)*i+2*q));printf("%lld\n",ans);
} 

bzoj #4827 礼物(FFT)(HNOI2017)相关推荐

  1. [BZOJ 4827][Hnoi2017]礼物

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

  2. bzoj 3055礼物运送 floyed + 状压DP

    bzoj 3055: 礼物运送 floyed first 设f[i][S]表示取到了S集合中的所有点(不一定是经过的所有点),最后停在了i的最优值. 初始就f[i][{i}] = dis[1][i] ...

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

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

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

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

  5. [4827][Hnoi2017]礼物——FFT

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

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

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

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

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

  8. bzoj4827: [Hnoi2017]礼物 FFT

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

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

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

最新文章

  1. 进阶SQL技巧:subquery, string function, window function
  2. windows上配置jdk环境变量
  3. codeforces 667A A. Pouring Rain(水题)
  4. GEF调色板中的多级树结构
  5. OpenWRT 随记
  6. cocob optimizer让学习率不再是算法参数
  7. ThinkPHP之MVC简析
  8. B. Box Fitting
  9. AI算法工程师手册!
  10. 一个企业为什么执行不力?
  11. Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
  12. 蓝桥杯 ADV-157算法提高 现代诗如蚯蚓
  13. js正则验证输入表情
  14. 扇贝有道180911每日一句
  15. XILINX FPGA数字信号处理——3、数字的表示和运算的实现
  16. RFNoC GNU Radio使用教程
  17. python程序员工资待遇-看看你是哪种级别的Python程序员(已跪)
  18. (一)安装Emacs
  19. 集成安装光盘制作教程(http://bbs.deepin.org/viewthread.php?tid=1170144)
  20. Windows 2016 修改密码时提示密码不符合规则

热门文章

  1. 什么蓝牙耳机佩戴舒服音质好?国庆出游佩戴的蓝牙耳机
  2. 在家里最简单有效的身体锻炼方法
  3. 树 (二叉树)--- (内含树(二叉树)的概念、二叉树性质、遍历(非递归)、习题)永不过时的数据结构
  4. c语言 二维数组实训题目程序,《C语言程序设计》1-3维数组随堂测试
  5. 用手机拍摄视频技巧大全
  6. 通知:PostgreSQL证书申报退税请抓紧
  7. 无人机视频图像运动目标检测算法综述------2019年-------------
  8. VS2017配置Qt5.9教程
  9. 【漏洞复现】XMind2020及2021beta版本存在xss漏洞导致任意代码执行
  10. L1-039 古风排版 Python