【HNOI2017/BZOJ4827】礼物 FFT

3人阅读 评论(0) 收藏 举报

原题走这里

原题相当于求(a[i]b[i]+C)2,其中b可以任意旋转,C为整数,由于原题中有a,b小于m的限制条件,所以C范围最大也大不过(m,m)
那么我们可以把式子拆开:

i=0n1(a[i]2+b[i]22a[i]b[i]+2C(a[i]b[i])+C2)

由于除了a[i]b[i]这一项以外,其他所有项都可以预处理或枚举,所以问题就转化为了:如何最大化:i=0n1a[i]b[i]
把b反转,就变成了i=0n1a[i]b[n1i],就可以FFT了。

然而旋转我们怎么处理呢?我们可以把上式拆开成:
i=0n1a[i]b[nj1i]+i=njn1a[i]+b[2nj1i]
FFT求出D[i]=A[i]B[i],上式就等于D[nj1]+D[2nj1]
枚举C求出最小值就可以了。

具体实现见代码如下:

#include <bits/stdc++.h>
using namespace std;
int n,m,N,sum,mx,mn=2e9,summ;
complex<double> a[200000],b[200000],aa[200000],w[200000];
void init() {
    const double pi=acos(-1);
    for(int i=0; i<N; i++) {
        w[i]=complex<double>(cos(2.0*pi*i/N),sin(2.0*pi*i/N));
    }
}
void FFT(complex<double> *a) {
    for(int i=0,j=0; i<N; i++) {
        if(i>j)swap(a[i],a[j]);
        for(int k=N>>1; (j^=k)<k; k>>=1);
    }
    for(int i=2; i<=N; i<<=1) {
        int m=i>>1,l=N/i;
        for(int j=0; j<N; j+=i) {
            for(int k=0; k!=m; k++) {
                complex<double> t=a[j+m+k]*w[l*k];
                a[j+m+k]=a[j+k]-t;
                a[j+k]+=t;
            }
        }
    }
}
int main() {
    cin>>n>>m;
    for(int i=0; i<n; i++) {
        cin>>a[i];
    }
    for(int i=0; i<n; i++) {
        cin>>b[n-i-1];
    }
    for(int i=0; i<n; i++) {
        sum+=round((a[i]*a[i]+b[n-i-1]*b[n-i-1]).real());
        summ+=round((b[i]-a[i]).real());
    }
    N=n<<1;
    for(int i=1; i<N; N=max(i<<=1,N));
    init();
    FFT(a);
    FFT(b);
    reverse(w+1,w+N);
    for(int i=0; i<N; i++) {
        a[i]*=b[i];
    }
    FFT(a);
    for(int i=0; i<N; i++) {
        a[i]/=N;
    }
    mx=a[n-1].real();
    for(int i=0; i<n-1; i++) {
        mx=max(mx,int(round((a[i]+a[i+n]).real())));
    }
    for(int i=-m; i<=m; i++) {
        mn=min(mn,n*i*i+2*i*summ);
    }
    cout<<sum-2*mx+mn<<endl;
    return 0;
}
查看评论

怎样用delphi制作一个IPhunter(独孤剑客的IP猎人)

有人说现在的程序员成了组装工人,其实很有道理,利用控件模块+少量代码就可以实现,delphi 5.0提供了丰富的internet控件,利用TCP/IP 客户端-服务端就可以解决问题。关键的控件是Ser...
  • ghj1976
  • ghj1976
  • 2000-12-01 15:59:00
  • 1748

bzoj 4827: [Hnoi2017]礼物 fft

题意有两个长度为n的序列,序列元素为[1,m]。 定义两个序列的差异值为∑ni=1(x[i]−y[i])2\sum_{i=1}^n(x[i]-y[i])^2 现在可以给第一个序列加上一个长度c,第...
  • qq_33229466
  • qq_33229466
  • 2017-04-17 20:51:12
  • 1108

bzoj4827: [Hnoi2017]礼物

看到要求∑(xi − y i+k -c )2的最小值。首先将xi − y i+k看作整体,得到一个关于c的二次函数nc^2+pc+q=0。发现q的形式将y数组翻转类似一个卷积,然后又发现其中每个值小于...
  • Miao_zc
  • Miao_zc
  • 2017-04-18 20:34:49
  • 660

bzoj 4827: [Hnoi2017]礼物 (FFT)

题目描述传送门题目大意:给出两个串,可以旋转和整串权值增加c,求操作后最小的∑ni=1(xi−yi)2\sum_{i=1}^n (x_i-y_i)^2题解先考虑不增加c。 ∑ni=1(xi−yi)2...
  • clover_hxy
  • clover_hxy
  • 2017-06-12 08:31:36
  • 179

BZOJ4827: [Hnoi2017]礼物

题意大致是求这样一个柿子的最小值∑ni=1(Ai−Bj+k)2\sum_{i=1}^n(A_i-B_j+k)^2其中k是你定的,j是经过旋转后i的对应位置 然后画一下柿子 ∑ni=1((Ai−Bj...
  • L_0_Forever_LF
  • L_0_Forever_LF
  • 2017-04-26 08:22:59
  • 522

BZOJ4827 [Hnoi2017]礼物

假设我们循环移动了x位,并另所有点都加了y,那么这时候的答案就是sigma (a[i+x]-b[i]+y)^2 把上式展开,发现除了一项-2*a[i+x]*b[i]外,要么是常数项,要么是关于y的一...
  • neither_nor
  • neither_nor
  • 2017-04-17 15:11:54
  • 1063

bzoj 4827 [Hnoi2017]礼物(FFT)

题意:有两个长度为n的序列,序列元素为[1,m]。定义两个序列的差异值为∑ni=1(x[i]−y[i])2现在可以给第一个序列加上一个长度c,第二个序列可以任意旋转,问最小差异值。n≤50000,m≤...
  • qq_29556211
  • qq_29556211
  • 2017-11-03 20:19:22
  • 67

【BZOJ4827】【HNOI2017】礼物(FFT)

题面Description我的室友最近喜欢上了一个可爱的小女生。马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她。每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度。...
  • qq_30974369
  • qq_30974369
  • 2017-12-30 09:36:41
  • 143

[BZOJ4827][Hnoi2017]礼物-FFT

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

bzoj4827 [Hnoi2017]礼物(FFT)

题目链接 分析: 求∑ni=1(xi−yi)2∑i=1n(xi−yi)2\sum_{i=1}^{n}(x_i-y_i)^2 假设我们旋转了jjj位,每一位上加ccc,则有式子 ∑ni=1(xi...
  • wu_tongtong
  • wu_tongtong
  • 2018-03-15 15:14:54
  • 30
    个人资料
    持之以恒
    等级:
    访问量: 738
    积分: 336
    排名: 20万+
    文章分类
    文章存档
    最新评论