题面

传送门:洛咕


Solution

调得我头大,我好菜啊

好吧,我们来颓柿子吧:

我们可以只旋转其中一个手环。对于亮度的问题,因为可以在两个串上增加亮度,我们也可以看做是可以为负数的。

所以说,我们可以假设我们旋转\(B\)串,上下要加上的亮度差为\(p\),可以直接拍出一个最暴力的柿子:

设\(f(x)\)表示\(B\)串以\(x\)为开头的差异值,有:

\(f(x)=\sum_{i=0}^{x-1}(B[i]-A[i+n-x]+p)^2+\sum_{i=x}^{n-1}(B[i]-A[i-x]+p)^2\)

大力展开化简后有:

\(f(x)=\sum_{i=0}^{n-1}A[i]^2+\sum_{i=0}^{n-1}B[i]^2+n*p^2-2p\sum_{i=0}^{n-1}(A[i]-B[i])-2\sum_{i=0}^{x-1}(B[i]*A[i+n-x])-2\sum_{i=x}^{n-1}(B[i]*A[i-x])\)

前两项\(\sum_{i=0}^{n-1}A[i]^2+\sum_{i=0}^{n-1}B[i]^2\)显然\(O(n)预处理出来\)

中间两项\(n*p^2-2p\sum_{i=0}^{n-1}(A[i]-B[i])\)是一个关于\(p\)的二次函数,我们找最小值就好。(因为这题\(m\)非常小,我们也可以暴力枚举),复杂度\(O(1)\)或\(O(m)\)。

最后两项\(-2\sum_{i=0}^{x-1}(B[i]*A[i+n-x])-2\sum_{i=x}^{n-1}(B[i]*A[i-x])\)看起来非常像卷积,但是并不是,因此我们得做点处♂理。

蒟蒻本人是这样处理的:

首先,后面那个循环范围是肯定没法卷的,因此我们先把后面的循环处理一下得:

\(-2\sum_{i=0}^{x-1}(B[i]*A[i+n-x])-2\sum_{i=0}^{n-x-1}(A[i]*B[i+x])\)

然后我们可以考虑把前面那项的\(A\)反转(这样可以处理掉\(n\)来方便卷积),把后面那项的\(B\)反转(这样可以制造\(n\)与\(\sum\)对应)

\(-2\sum_{i=0}^{x-1}(B[i]*A'[x-1-i])-2\sum_{i=0}^{n-x-1}(A[i]*B'[n-1-i-x])\)

哦豁,卷积,搞定。

时间复杂度\(O(n*logn)\)


Code

我什么时候才能一次性写对FFT啊

//Luogu P3723 [AH2017/HNOI2017]礼物
//Jan,20th,2019
//颓柿子+FFT加速计算
#include<iostream>
#include<cstdio>
#include<cmath>
#include<complex>
#include<algorithm>
using namespace std;
long long read()
{
long long x=0,f=1; char c=getchar();
while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int M=50000+100;
const int N=M*4;
const double PI=acos(-1);
typedef complex <double> cp;
inline cp omega(int K,int n)
{
return cp(cos(2*PI*K/n),sin(2*PI*K/n));
}
void FFT(cp a[],int n,bool type)
{
static int tmp[N],num=n-1,len=0;
while(num!=0) num/=2,len++;
for(int i=0,j;i<=n;i++)
{
for(j=0,num=i;j<len;j++)
tmp[j]=num%2,num/=2;
reverse(tmp,tmp+len);
for(j=0,num=0;j<len;j++)
num+=tmp[j]*(1<<j);
if(i<num) swap(a[i],a[num]);
}
for(int l=2;l<=n;l*=2)
{
cp x0=omega(1,l);
if(type==true) x0=conj(x0);
int m=l/2;
for(int j=0;j<n;j+=l)
{
cp x(1,0);
for(int k=0;k<m;k++,x*=x0)
{
cp temp=x*a[j+k+m];
a[j+k+m]=a[j+k]-temp;
a[j+k]=a[j+k]+temp;
}
}
}
}
int n,m,a[N],b[N];
cp B1[N],A1[N],B2[N],A2[N];
long long ans;
int main()
{
freopen("3723.in","r",stdin); n=read(),m=read();
for(int i=0;i<n;i++)
a[i]=read();
for(int i=0;i<n;i++)
b[i]=read(); long long dif=0;
for(int i=0;i<n;i++)
ans+=a[i]*a[i]+b[i]*b[i],dif+=a[i]-b[i];
long long t_ans=0x3f3f3f3f*0x3f3f3f3f;
for(int i=-m;i<=m;i++)
t_ans=min(t_ans,n*i*i-2*i*dif);
ans+=t_ans; int t=1;
while(t<2*n) t*=2;
reverse(a,a+n);
for(int i=0;i<n;i++)
A1[i]=a[i],B1[i]=b[i];
FFT(A1,t,false);
FFT(B1,t,false);
for(int i=0;i<t;i++)
A1[i]*=B1[i];
FFT(A1,t,true);
for(int i=0;i<t;i++)
A1[i].real()/=t; reverse(a,a+n);
reverse(b,b+n);
for(int i=0;i<n;i++)
A2[i]=a[i],B2[i]=b[i];
FFT(A2,t,false);
FFT(B2,t,false);
for(int i=0;i<t;i++)
A2[i]*=B2[i];
FFT(A2,t,true);
for(int i=0;i<t;i++)
A2[i].real()/=t; t_ans=(long long)(2*floor(A2[n-1].real()+0.5));
for(int i=1;i<n;i++)
t_ans=max(t_ans,(long long)(2*floor(A1[i-1].real()+A2[n-i-1].real()+0.5)));
ans-=t_ans;
printf("%lld",ans);
return 0;
}

[Luogu P3723] [AH2017/HNOI2017]礼物 (FFT 卷积)的更多相关文章

  1. LUOGU P3723 [AH2017/HNOI2017]礼物 (fft)

    传送门 解题思路 首先我们设变化量为\(r\),那么最终的答案就可以写成 : \[ ans=min(\sum\limits_{i=1}^n(a_i-b_i+r)^2) \] \[ ans=min(\s ...

  2. 洛谷 P3723 [AH2017/HNOI2017]礼物 解题报告

    P3723 [AH2017/HNOI2017]礼物 题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个 ...

  3. P3723 [AH2017/HNOI2017]礼物

    题目链接:[AH2017/HNOI2017]礼物 题意: 两个环x, y 长度都为n k可取 0 ~ n - 1      c可取任意值 求 ∑ ( x[i] - y[(i + k) % n + 1] ...

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

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

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

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

  6. Luogu 3723 [AH2017/HNOI2017]礼物

    BZOJ 4827 $$\sum_{i = 1}^{n}(x_i - y_i + c)^2 = \sum_{i = 1}^{n}(x_i^2 + y_i^2 + c^2 - 2 * x_iy_i + ...

  7. 洛谷P3723 [AH2017/HNOI2017]礼物

    吴迪说他化学会考上十分钟就想出来了,太神了%%%不过我也十分钟 但是调了一个多小时啊大草 懒得人话翻译了,自己康吧: 我的室友(真的是室友吗?)最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决 ...

  8. 笔记-[AH2017/HNOI2017]礼物

    笔记-[AH2017/HNOI2017]礼物 [AH2017/HNOI2017]礼物 \[\begin{split} ans_i=&\sum_{j=1}^n(a_j-b_j+i)^2\\ =& ...

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

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

随机推荐

  1. 微信小程序-简介

    微信小程序定位 1. 不需要下载安装即可使用 2. 用户用完即走,不用关系是否安装太多应用 3. 应用无处不在,随时可用 # 不要安装可使用是个伪命题,因为小程序的安装包小于1M,下载安装到使用的过程 ...

  2. Git入门教程,详解Git文件的四大状态

    大家好,欢迎来到周一git专题. git clone 在上一篇文章当中我们聊了怎么在github当中创建一个属于自己的项目(repository),简称repo.除了建立自己的repo之外,我们更多的 ...

  3. Camera光学、成像和 3A 算法 (视觉),camera开发

    简单介绍 转载:https://blog.csdn.net/ShareUs/article/details/94295628 成像与光学.计算机视觉,图像处理,数字成像.自动驾驶与视觉. 镜头设计:人 ...

  4. 用Python爬取B站、腾讯视频、爱奇艺和芒果TV视频弹幕!

    众所周知,弹幕,即在网络上观看视频时弹出的评论性字幕.不知道大家看视频的时候会不会点开弹幕,于我而言,弹幕是视频内容的良好补充,是一个组织良好的评论序列.通过分析弹幕,我们可以快速洞察广大观众对于视频 ...

  5. SpringCache整合Redis

    之前一篇文章 SpringBoot整合Redis 已经介绍了在SpringBoot中使用redisTemplate手动 操作redis数据库的方法了.其实这个时候我们就已经可以拿redis来做项目了, ...

  6. 微服务通信之feign集成负载均衡

    前言 书接上文,feign接口是如何注册到容器想必已然清楚,现在我们着重关心一个问题,feign调用服务的时候是如何抉择的?上一篇主要是从读源码的角度入手,后续将会逐步从软件构架方面进行剖析. 一.R ...

  7. Java安全之Javassist动态编程

    Java安全之Javassist动态编程 0x00 前言 在调试CC2链前先来填补知识盲区,先来了解一下Javassist具体的作用.在CC2链会用到Javassist以及PriorityQueue来 ...

  8. java中break、continue、return作用

    java中break.continue.return作用 0.首先要明确:break和continue是作用对象是循环体:而return的作用对象是方法 break:在执行完本次循环后,跳出所在的循环 ...

  9. 爬虫之Selenium

    简介 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如 ...

  10. day25 Pyhton学习 MD5加密.日志

    一.MD5加密 MD5是一种不可逆的加密算法. 它是可靠的. 并且安全的. 在python中我们不需要手写这一套算法. 只需要引入一个叫hashlib的模块就能搞定MD5的加密工作 import ha ...