博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 4827 [Hnoi2017]礼物 ——FFT
阅读量:5985 次
发布时间:2019-06-20

本文共 1749 字,大约阅读时间需要 5 分钟。

题目上要求一个循环卷积的最小值,直接破环成链然后FFT就可以了。

然后考虑计算的式子,可以分成两个部分分开计算。

前半部分FFT,后半部分扫一遍。

#include #include 
#include
#include
#include
#include
#include
#include
using namespace std;#define F(i,j,k) for (int i=j;i<=k;++i)#define D(i,j,k) for (int i=j;i>=k;--i)#define ll long long#define double long double#define llinf 10000000000000000LL#define maxn 500005#define eps 1e-6 struct Complex{ double x,y; Complex (){} Complex (double _x,double _y){x=_x;y=_y;} Complex operator + (Complex a) {return Complex(x+a.x,y+a.y);} Complex operator - (Complex a) {return Complex(x-a.x,y-a.y);} Complex operator * (Complex a) {return Complex(x*a.x-y*a.y,x*a.y+y*a.x);}}A[maxn],B[maxn]; const double pi=acos(-1.0);int rev[maxn];ll ans=llinf,res[maxn],sumA2=0,sumB2=0,sumA=0,sumB=0; void FFT(Complex *x,int n,int flag){ F(i,0,n-1) if (rev[i]>i) swap(x[rev[i]],x[i]); for (int m=2;m<=n;m<<=1) { Complex wn=Complex(cos(2*pi/m),flag*sin(2*pi/m)); for (int i=0;i
>1);++j) { Complex u=x[i+j],v=x[i+j+(m>>1)]*w; x[i+j]=u+v;x[i+j+(m>>1)]=u-v; w=w*wn; } } }} int n,m,L=0; int main(){ scanf("%d%d",&n,&m); F(i,0,n-1) { int x;scanf("%d",&x); A[i].x=x; sumA+=x; sumA2+=(ll)x*x; } D(i,n-1,0) { int x;scanf("%d",&x); B[i].x=x; sumB+=x; sumB2+=(ll)x*x; B[i+n].x=B[i].x; } for(m=1;m<=4*n;m<<=1);while(!(m>>L&1))L++; F(i,0,m-1)rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1)); FFT(A,m,1);FFT(B,m,1);F(i,0,m-1)A[i]=A[i]*B[i];FFT(A,m,-1); F(i,0,m-1) res[i]=(A[i].x+0.4)/m; F(i,-100,100) { ll tmp=2*i*(sumA-sumB)+n*i*i; F(j,n-1,2*n-1) ans=min(ans,sumA2+sumB2+tmp); } ll tmp=-llinf; F(i,n-1,2*n-1) tmp=max(tmp,res[i]); ans-=2*tmp; printf("%lld\n",ans);}

  

转载于:https://www.cnblogs.com/SfailSth/p/6813479.html

你可能感兴趣的文章
下载 ....aar jitpack.io 打不开。
查看>>
c语言显示八进制和十六进制数
查看>>
一起谈.NET技术,Discuz!NT 缓存设计简析 [原创]
查看>>
browser-sync默认地址如何转成127.0.0.1
查看>>
学习php脚本
查看>>
Git使用
查看>>
Spark之键值RDD转换(转载)
查看>>
2017-2018-2 20155225《网络对抗技术》实验二+ 后门进阶
查看>>
SQL报错 个人收集
查看>>
BZOJ 1257: [CQOI2007]余数之和sum【神奇的做法,思维题】
查看>>
关于int *a[常量]与int (*a)[常量]的分析与区分(详解)
查看>>
Nodejs 第一站
查看>>
遇到女神应该使用什么样的暗恋思维
查看>>
(转)李明博:我的12年等于24年
查看>>
双向链接表 linux
查看>>
从 1.1.0 升级到 1.2.0 的注意事项
查看>>
用Moq让单元测试变得更简单
查看>>
GNU make manual 翻译( 九十六)
查看>>
第十八章 11 string字符串的比较
查看>>
SerialPort实现modem的来电显示 转
查看>>