记得FFT要开大数组!!开到快MLE的那种!!我这个就是例子TAT,5e5都RE了

在这题上花的时间太多了,还是FFT不太熟练。

首先看70分的n方做法:从0下标开始存,先n--,把a数组倍增,然后枚举a数组的起点st(相当于环上a的st和b的0相匹配),设x为增量

\[\sum_{i=0}^{n}(a[i+s]+x-b[i])^2
\]

\[=\sum_{i=0}^{n}(a[i+s]-b[i])^2+x^2-2*x*(a[i+s]-b[i])
\]

\[=\sum_{i=0}^{n}(a[i+s]-b[i])^2+n*x^2-x*2*\sum_{i=0}^{n}(a[i+s]-b[i])
\]

\[a=n,b=2*\sum_{i=0}^{n}(a[i+s]-b[i]),c=\sum_{i=0}^{n}(a[i+s]-b[i])^2
\]

显然这是一个开口向上的二次函数,所以可以用二次函数求顶点公式求。(注意!不能直接求y,因为x是整数,但是求顶点公式求出来的不一定是,我简单粗暴的把floor和ceil取了个min)

这个暴力在考场上性价比非常高,大概20min就能得70分;

然后正解,观察上面式子,发现设:

\[sa=\sum_{i=0}^{n}a[i],saf=\sum_{i=0}^{n}a[i]*a[i]
\]

\[sb=\sum_{i=0}^{n}b[i],sbf=\sum_{i=0}^{n}b[i]*b[i]
\]

那么:

\[a=n,b=2*(sa-sb),c=saf+sab-2*\sum_{i=0}^{n}(a[i+s]*b[i])
\]

现在只有设\( c[i]=\sum_{i=0}^{n}(a[i+s]*b[i]) \),不是常数,考虑怎么把它化成卷积形式然后FFT预处理。

设:

\[z[i]=\sum_{j=0}^{n-i}x[j]y[i+j],f[i]=\sum_{j=0}^{n-i}y[j]x[i+j]
\]

\[c[i]=z[i]+f[n-i+1]
\]

设nx为x数组反过来,设ny为y数组反过来,然后随便推一推就会发现z和f变成这样:

\[z[n-i]=\sum_{j=0}^{n-i}x[i-j]ny[j],f[n-i]=\sum_{j=0}^{n-i}y[i-j]nx[j]
\]

然后FFT预处理即可;

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=1000005;
int re[N],lm,bt;
long long n,m,a[N],b[N],sa,saf,sb,sbf,c[N],x1,x2,ans=1e18;
struct cd
{
double r,i;
cd(double R=0,double I=0)
{
r=R,i=I;
}
cd operator + (const cd &a) const
{
return cd(r+a.r,i+a.i);
}
cd operator - (const cd &a) const
{
return cd(r-a.r,i-a.i);
}
cd operator * (const cd &a) const
{
return cd(r*a.r-i*a.i,a.r*i+a.i*r);
}
}x[N],y[N],nx[N],ny[N];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void dft(cd a[],int f)
{
for(int i=0;i<lm;i++)
if(i<re[i])
swap(a[i],a[re[i]]);
for(int i=1;i<lm;i<<=1)
{
cd wi=cd(cos(M_PI/i),f*sin(M_PI/i));
for(int k=0;k<lm;k+=(i<<1))
{
cd w=cd(1,0),x,y;
for(int j=0;j<i;j++)
{
x=a[k+j];
y=a[i+j+k]*w;
a[k+j]=x+y;
a[i+j+k]=x-y;
w=w*wi;
}
}
}
if(f==-1)
{
for(int i=0;i<lm;i++)
a[i].r/=lm;
}
}
void fft(cd a[],cd b[])
{
dft(a,1);
dft(b,1);
for(int i=0;i<lm;i++)
a[i]=a[i]*b[i];
dft(a,-1);
}
int main()
{
n=read()-1,m=read();
for(int i=0;i<=n;i++)
a[i]=read(),sa+=a[i],saf+=a[i]*a[i];
for(int i=0;i<=n;i++)
b[i]=read(),sb+=b[i],sbf+=b[i]*b[i];
for(int i=0;i<=n;i++)
{
x[i].r=b[i],y[i].r=a[i];
nx[i].r=b[n-i],ny[i].r=a[n-i];
}
for(lm=1,bt=0;lm<=2*n;bt++,lm<<=1);
for(int i=0;i<lm;i++)
re[i]=(re[i>>1]>>1)|((i&1)<<(bt-1));
fft(x,ny);
fft(y,nx);
for(int i=0;i<=n;i++)
c[i]=(int)(1.0*(x[n-i].r+y[i-1].r)+0.5);//,cout<<c[i]<<endl;
x1=0-floor(1.0*(sa-sb)/(n+1)),x2=0-ceil(1.0*(sa-sb)/(n+1));//cout<<x1<<" "<<x2<<endl;
for(int i=0;i<=(n+1);i++)
{
ans=min(ans,min((n+1)*x1*x1+2*(sa-sb)*x1+saf+sbf-2*c[i],(n+1)*x2*x2+2*(sa-sb)*x2+saf+sbf-2*c[i]));
// cout<<sa<<" "<<sb<<" "<<saf<<" "<<sbf<<" "<<x1<<" "<<x2<<" "<<c[i]<<" "<<ans<<endl;
}
printf("%lld\n",ans);
return 0;
}

bzoj 4827: [Hnoi2017]礼物【FFT】的更多相关文章

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

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

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

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

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4827 首先,旋转对应,可以把 b 序列扩展成2倍,则 a 序列对应到的还是一段区间: 再把 ...

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

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

  5. bzoj 4827: [HNOI2017]礼物 (FFT)

    一道FFT 然而据说暴力可以水70分 然而我省选的时候看到了直接吓傻了  连暴力都没打 太弱了啊QAQ emmmm 详细的拆开就看其他题解吧233 最后那一步卷积其实我一直没明白 后来画画图终于懂了 ...

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

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

  7. BZOJ 4827: [Hnoi2017]礼物 FFT_多项式_卷积

    题解稍后在笔记本中更新 Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r&q ...

  8. BZOJ:4827: [Hnoi2017]礼物

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

  9. 4827: [Hnoi2017]礼物

    4827: [Hnoi2017]礼物 链接 分析: 求最小的$\sum_{i=1}^{n}(x_i-y_i)^2$ 设旋转了j位,每一位加上了c. $\sum\limits_{i=1}^{n}(x_{ ...

随机推荐

  1. MySql数据库导出csv文件命令

    MySql数据库导出csv文件命令: MySql数据库导出csv文件命令: mysql> select first_name,last_name,email from account into ...

  2. LINUX 下 ipv6 socket 编程

    大家都知道,随着互联网上主机数量的增多,现有的32位IP地址已经不够用了,所以推出了下一代IP地址IPv6,写网络程序的要稍微改变一下现有的网络程序适应IPv6网络是相当容易的事.对于我们来说就是IP ...

  3. asterisk 通道变量

    ${ACCOUNTCODE}: 用户计费帐号 sip.conf 里的 account=XXXX ${ANSWEREDTIME}: 通话时长(秒) ${BLINDTRANSFER}: 通道是否为转接类型 ...

  4. Spring Data Redis与Jedis的选择(转)

    说明:内容可能有点旧,需要在业务上做权衡. Redis的客户端有两种实现方式,一是可以直接调用Jedis来实现,二是可以使用Spring Data Redis,通过Spring的封装来调用.应该使用哪 ...

  5. 火狐firefox、谷歌chrome等浏览器扩展、插件介绍

    火狐旧的插件扩展已经不可用,需要更新,这是本人安装的最新的插件 chrome插件 https://www.zhihu.com/question/68338297

  6. ssh 执行多条命令包含awk的用法

    格式:ssh user@ip command 单条命令:ssh user@ip command1 多条命令:ssh user@ip "command1;command2" 不加双引 ...

  7. 《javascript设计模式》读书笔记二(封装和隐藏信息)

    1.为什么要封装和信息隐藏 做过编程的朋友们知道"耦合"这个词.事实上封装的效果就是为了解耦,让类和类之间没有太多的联系,防止某一天改动某一类的时候,产生"多米骨诺牌效应 ...

  8. Centos java 安装

    第一步:查看Linux自带的JDK是否已安装 (卸载centOS已安装的1.4) 安装好的CentOS会自带OpenJdk,用命令 java -version ,会有下面的信息: java versi ...

  9. MySQL基础笔记(一) SQL简介+数据类型

    MySQL是一个关系型数据库管理系统(RDBMS),它是当前最流行的 RDBMS 之一.MySQL分为社区版和企业版,由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发 ...

  10. IOS 字典模型互转框架 MJExtension

    IOS 字典模型互转框架 MJExtension   能做什么? MJExtension是一套字典和模型之间互相转换的超轻量级框架 MJExtension能完成的功能 字典(JSON) -->  ...