Hihocoder1388 2016年北京网络赛 FFT
来源:互联网 发布:手机怎么成为网络歌手 编辑:程序博客网 时间:2024/06/11 18:56
题目链接
题目不难看懂,首先把公式变形:
问题转化成求
很明显这是一个循环卷积求和的问题,利用FFT可以确定最大值
WA点1.不能利用FFT直接求结果,有较大的精度误差,只能用其判断k的值
WA点2.一定要熟悉convert的过程,跑FFT把两个卷积的数组构造好,并且知道我们需要那一部分的卷积结果
AC代码:FFT用bin神的模版:
最后,网络赛时候我们是暴力+XJBG做出来的,丑陋
#include <bits/stdc++.h>const int maxn=200000+10;const double PI=acos(-1);typedef long long ll;using namespace std;int n,str1[maxn],str2[maxn],len;struct Complex{ double r,i; Complex(double _r = 0.0,double _i = 0.0){ r = _r; i = _i; } Complex operator +(const Complex &b){ return Complex(r+b.r,i+b.i); } Complex operator -(const Complex &b){ return Complex(r-b.r,i-b.i); } Complex operator *(const Complex &b){ return Complex(r*b.r-i*b.i,r*b.i+i*b.r); }};void rader(Complex y[],int len){ int i,j,k; for(i=1,j=len/2;i<len-1;i++){ if(i<j) swap(y[i],y[j]); k=len/2; while(j>=k){ j-=k; k/=2; } if(j<k) j+=k; }}void fft(Complex y[],int len,int on){ rader(y,len); for(int h=2; h<=len;h=h<<1){ Complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h)); for(int j=0;j<len;j+=h){ Complex w(1,0); for(int k = j;k<j+h/2;k++){ Complex u = y[k]; Complex t = w*y[k+h/2]; y[k]=u+t; y[k+h/2]=u-t; w=w*wn; } } } if(on==-1) for(int i=0;i<len;i++) y[i].r/=len;}void convert(Complex a[],Complex b[],int len){ fft(a,len,1); //DFT fft(b,len,1); for(int i=0;i<len;i++) //时域卷积=频域相乘 a[i]=a[i]*b[i]; fft(a,len,-1);//IDFT}Complex x1[maxn],x2[maxn];void init(){ len=1; while(len<n*2) len=len<<1; for(int i=0;i<n;i++) x1[i]=Complex(str1[n-i-1],0); //注意此处取反,理解convert的性质 for(int i=n;i<len;i++) x1[i]=Complex(0,0); for(int i=0;i<n;i++) x2[i]=Complex(str2[i],0); for(int i=n;i<2*n;i++) x2[i]=Complex(str2[i-n],0); for(int i=2*n;i<len;i++) x2[i]=Complex(0,0);}int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&str1[i]); for(int i=0;i<n;i++) scanf("%d",&str2[i]); init(); convert(x1,x2,len); ll max=-1,k=0; for(int i=0;i<len;i++){ if(max<x1[i].r){ max=x1[i].r; k=i-n+1; } } ll ans=0; for(int i=0;i<n;i++) ans+=1ll*(str1[i]-str2[(i+k)%n])*(str1[i]-str2[(i+k)%n]); printf("%lld\n",ans); } return 0;}
0 0
- Hihocoder1388 2016年北京网络赛 FFT
- 2016ICPC北京站网络预选赛F hihoCoder1388 Periodic Signal,FFT|NTT+CRT
- 【hihoCoder #1388】【2016 acm 北京网络赛 F题】【FFT】 Periodic Signal
- hihocoder 1388 2016北京网络赛1006 Periodic Signal(卡精度的FFT)
- hihocoder 1388 2016北京网络赛1006 Periodic Signal(卡精度的FFT)
- HihoCoder1388(Periodic Signal)-fft(快速傅里叶变换)
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛 F. Periodic Signal(FFT 优化乘法)
- 2016北京网络赛C hihocoder
- hiho1385 -- 模拟题(2016北京网络赛)
- hiho1385 -- 模拟题(2016北京网络赛)
- hihocoder1391Countries(2016北京网络赛)
- Eliminate Witches!2011年北京网络赛
- [2014 北京网络赛]
- 北京网络赛
- 2017北京网络赛
- 2016 acm香港网络赛 A.A+B problem[FFT]
- 2016 香港网络赛 A题. A+B Problem (FFT)
- 2013长沙网络赛G Goldbach FFT
- 什么是数据结构和算法
- dom4j解析xml
- VMWare workstation之网络环境搭建
- ovs的netdev, ofproto以及dpif etc.
- java jdk1.8安装问题,若修改安装路径,则找不到\lib\tools.jar
- Hihocoder1388 2016年北京网络赛 FFT
- C++ I/O复用实现聊天室程序
- 驱动基础认识
- Quickstart: Docker Compose and Django
- 梦现堂之互联网时代:中国梦•大学生就业创业公益论坛
- 老毛桃U盘启动制作
- Python error: Microsoft Visual C++ 10.0 is required (Unable to find vcvarsall.bat).
- 致2016
- Python -- 如何安装.whl包?