日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P3723-[AH2017/HNOI2017]礼物【FFT】

發布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3723-[AH2017/HNOI2017]礼物【FFT】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P3723


題目大意

兩個長度為nnn的序列xxxyyy,可以旋轉序列xxx之后讓一個序列的所有數加上一個非負整數ccc

要求最小化∑i=1n(xi?yi)2\sum_{i=1}^n(x_i-y_i)^2i=1n?(xi??yi?)2


解題思路

其實就是要求最小化∑i=1n(xi+c?yi)2\sum_{i=1}^n(x_i+c-y_i)^2i=1n?(xi?+c?yi?)2
?∑i=1nxi2+∑i=1nyi2+2nc2+2?(∑i=1nxi?∑j=1nyi)+2?∑i=1xiyi\Rightarrow \sum_{i=1}^nx_i^2+\sum_{i=1}^ny_i^2+2nc^2+2*(\sum_{i=1}^nx_i-\sum_{j=1}^ny_i)+2*\sum_{i=1}x_iy_i?i=1n?xi2?+i=1n?yi2?+2nc2+2?(i=1n?xi??j=1n?yi?)+2?i=1?xi?yi?

式子由很多個分開的段組成,其中對于2nc2+2?(∑i=1nxi?∑j=1nyi)2nc^2+2*(\sum_{i=1}^nx_i-\sum_{j=1}^ny_i)2nc2+2?(i=1n?xi??j=1n?yi?)我們可以枚舉ccc來求最小值,然后考慮最小化2?∑i=1nxiyi2*\sum_{i=1}^nx_iy_i2?i=1n?xi?yi?

對于式子∑i=1nxiyi\sum_{i=1}^nx_iy_ii=1n?xi?yi?xix_ixi?翻轉之后就成了∑i=1nxn?i+1yi\sum_{i=1}^nx_{n-i+1}y_ii=1n?xn?i+1?yi?,是一個卷積的形式,我們再把翻轉后的xxx復制一份放在后面,然后跑多項式乘法就可以發現對于乘法后的多項式fn+if_{n+i}fn+i?這個位置就是將序列xxx翻轉iii次之后的答案。

時間復雜度O(nlog?n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #include<complex> #include<cmath> #define ll long long using namespace std; typedef complex<double> comp; const double Pi=acos(-1.0); const ll N=4e5+10; ll n,m,r[N],g[N],answer,ans,suma,sumb; comp a[N],b[N]; void fft(comp *f,ll op){for(ll i=0;i<n;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=n;p<<=1){ll len=p>>1;comp tmp(cos(Pi/len),sin(Pi/len)*op);for(ll k=0;k<n;k+=p){comp buf(1,0);for(ll i=k;i<k+len;i++){comp tt=buf*f[i+len];f[i+len]=f[i]-tt;f[i]=f[i]+tt;buf=buf*tmp;}} }if(op==-1)for(ll i=0;i<n;i++)g[i]=(ll)(f[i].real()/n+0.5);return; } void Mul(){ll m;for(m=3*n,n=1;n<=m;n<<=1);for(ll i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)?(n>>1):0);fft(a,1);fft(b,1);for(ll i=0;i<n;i++)a[i]=a[i]*b[i];fft(a,-1);return; } int main() {scanf("%lld%lld",&n,&m);ll k=n;for(ll i=1;i<=n;i++){scanf("%lf",&a[i]);ans+=a[i].real()*a[i].real();suma+=a[i].real();}for(ll i=1;i<=n;i++){scanf("%lf",&b[i]);ans+=b[i].real()*b[i].real();sumb+=b[i].real();}for(ll i=1;i<=n/2;i++)swap(a[i],a[n-i+1]);for(ll i=1;i<=n;i++)a[i+n]=a[i];Mul();answer=1e18;for(ll i=k+1;i<=2*k;i++)for(ll j=-m;j<=m;j++)answer=min(answer,ans+k*j*j+2ll*j*(suma-sumb)-2ll*g[i]);printf("%lld",answer); }

總結

以上是生活随笔為你收集整理的P3723-[AH2017/HNOI2017]礼物【FFT】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。