所有的下标从 \(0\) 开始。

考虑枚举 \(C\) (第一个加上负的等于第二个加上其绝对值)和第二个手链的偏移量 \(p\)。答案就是

\[\sum_{i=0}^{n-1}(x_i+C-y_{(i+p) \bmod n})^2
\]

复制一遍 \(y\) 数组就能去掉取模了,再展开就是

\[\sum_{i=0}^{n-1}((x_i+C)^2-2(x_i+C)y_{i+p}+y_{i+p}^2)
\]

再展开就是

\[\sum_{i=0}^{n-1}(x_i+C)^2-2\sum_{i=0}^{n-1}x_iy_{i+p}-2C\sum_{i=0}^{n-1}y_i+\sum_{i=0}^{n-1}y_i^2
\]

发现除了第二项别的都可以预处理后在枚举 \(C\) 时 \(O(1)\) 得到,问题在于怎样快速求第二项。将 \(x\) 数组翻转就成了

\[\sum_{i=0}^{n-1}x_{n-i-1}y_{i+p}
\]

显然 \(p\) 所对应的数就是 fft 后的第 \(n+p-1\) 项。fft 一次后枚举 \(C,p\) 即可。当然你也可以三分 \(C\)。

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
int n, m, xx[50005], yy[50005], lim=1, tmpcnt, rev[300005];
ll ans=0x3f3f3f3f3f3f3f3f, sumxi, sumyi, sumxifang, sumyifang;
const double PI=acos(-1.0);
struct Complex{
double x, y;
Complex(double xx=0.0, double yy=0.0){
x = xx;
y = yy;
}
Complex operator+(const Complex &u)const{
return Complex(x+u.x, y+u.y);
}
Complex operator-(const Complex &u)const{
return Complex(x-u.x, y-u.y);
}
Complex operator*(const Complex &u)const{
return Complex(x*u.x-y*u.y, x*u.y+y*u.x);
}
}A[300005], B[300005];
void fft(Complex a[], int opt){
for(int i=0; i<lim; i++)
if(i<rev[i])
swap(a[i], a[rev[i]]);
for(int i=2; i<=lim; i<<=1){
Complex wn=Complex(cos(PI*2/i), opt*sin(PI*2/i));
int tmp=i>>1;
for(int j=0; j<lim; j+=i){
Complex w=Complex(1.0, 0.0);
for(int k=0; k<tmp; k++){
Complex tmp1=a[j+k], tmp2=w*a[j+k+tmp];
a[j+k] = tmp1 + tmp2;
a[j+k+tmp] = tmp1 - tmp2;
w = w * wn;
}
}
}
if(opt<0)
for(int i=0; i<lim; i++)
a[i].x /= lim;
}
int main(){
cin>>n>>m;
for(int i=0; i<n; i++){
scanf("%d", &xx[i]);
sumxi += xx[i];
sumxifang += xx[i] * xx[i];
A[n-i-1].x = xx[i];
}
for(int i=0; i<n; i++){
scanf("%d", &yy[i]);
sumyi += yy[i];
sumyifang += yy[i] * yy[i];
B[i+n].x = B[i].x = yy[i];
}
while(lim<=3*n) lim <<= 1, tmpcnt++;
for(int i=0; i<lim; i++)
rev[i] = (rev[i>>1]>>1) | ((i&1)<<(tmpcnt-1));
fft(A, 1);
fft(B, 1);
for(int i=0; i<lim; i++)
A[i] = A[i] * B[i];
fft(A, -1);
for(int C=-m; C<=m; C++){
for(int p=0; p<n; p++){
ll tmp=(ll)(A[n+p-1].x+0.5);
ll test=0;
for(int i=0; i<n; i++)
test += xx[i] * yy[(i+p)%n];
tmp = -2 * tmp;
tmp += sumxifang + (ll)2 * C * sumxi + (ll)C * C * n;
tmp -= (ll)2 * C * sumyi;
tmp += sumyifang;
ans = min(ans, tmp);
}
}
cout<<ans<<endl;
return 0;
}

loj2020 「HNOI2017」礼物的更多相关文章

  1. AC日记——「HNOI2017」礼物 LiBreOJ 2020

    #2020. 「HNOI2017」礼物 思路: A题进程: 一眼出式子->各种超时过不去->看题解明白还有fft这个东西->百度文库学习fft->学习dft->学习fft ...

  2. loj#2020 「AHOI / HNOI2017」礼物 ntt

    loj#2020 「AHOI / HNOI2017」礼物 链接 bzoj没\(letex\),差评 loj luogu 思路 最小化\(\sum\limits_1^n(a_i-b_i)^2\) 设改变 ...

  3. 「AHOI / HNOI2017」礼物

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

  4. AC日记——「HNOI2017」单旋 LiBreOJ 2018

    #2018. 「HNOI2017」单旋 思路: set+线段树: 代码: #include <bits/stdc++.h> using namespace std; #define max ...

  5. loj#2020. 「AHOI / HNOI2017」礼物

    题意:给定xy数组求 \(\sum_{i=0}^{n-1}(x_i+y_{(i+k)\modn}+c)^2\) 题解:先化简可得 \(n*c^2+2*\sum_{i=0}^{n-1}x_i-y_i+\ ...

  6. 「AH2017/HNOI2017」礼物

    题目链接 戳我 \(Solution\) 应为我们可以将任意一个数列加上一个非负整数,即可以变为将一个数列加上一个整数(可以为负),我们将这个整数设为\(z\).所以要求的式子的变为: \[\sum_ ...

  7. 「Poetize9」礼物运送

    3055: 礼物运送 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 18  Solved: 12[Submit][Status] Description ...

  8. 「SNOI2017」礼物

    题目链接:Click here Solution: 设\(f(x)\)代表第\(x\)个人送的礼物的数量,\(s(x)\)代表\(f(x)\)的前缀和,即: \[ f(x)=s(x-1)+x^k\\ ...

  9. loj2021 「HNOI2017」大佬

    there #include <algorithm> #include <iostream> #include <cstring> #include <cst ...

随机推荐

  1. Flash图表FusionCharts如何自定义图表导出菜单或界面

    FusionCharts的导出组件界面有两种模式: Compact Mode: 用于保存单张图片,每一个单独的导出组件实例都代表单独的图表.在这种模式下,只有一个按钮和标题是可见的. Full Mod ...

  2. PLSQL Developer 12 保存登录的用户名和密码

    1. 登录 PLSQL Developer PLSQL Developer > Preferences 2. Preferences > Logon History > Defini ...

  3. SQLSERVER是怎麽通过索引和统计信息来找到目标数据的(第三篇)

    SQLSERVER是怎麽通过索引和统计信息来找到目标数据的(第三篇) 最近真的没有什么精力写文章,天天加班,为了完成这个系列,硬着头皮上了 再看这篇文章之前请大家先看我之前写的第一篇和第二篇 第一篇: ...

  4. HYSBZ 1010 玩具装箱toy (决策单调DP)

    题意: 有n个玩具,要将它们分为若干组,玩具长度C可能不同.给出n个玩具的摆放顺序,连续的任意多个玩具都可以成为一组.区间[i,j]成为一组的费用是cost=(j-i+Sigma(Ck)-L)2且i& ...

  5. 无旋Treap【模板】P3369

    题目 详情见链接. 代码 #include<cstdio> #include<iostream> #define outd(x) printf("%d\n" ...

  6. Spring归纳

    Spring总结 bean标签的scope属性 scope="singleton",单例模式,默认值 scope="prototype",多例模式 注解元素 @ ...

  7. Android颜色选择器介绍

    使用Android的颜色选择器可以让我们的view在不同状态下显示不同的颜色. 1.Android中ListView 选择某项改变该行字体颜色 2.文件位置 res/color/filename.xm ...

  8. sum特殊用法

    在python中,list可以存储False和True a = [False] python的sum除了可以加数字,还可以计算列表中False,True的个数,默认是计算False个数 >> ...

  9. MFC多文档无法显示可停靠窗格

    当我们使用MFC多文档创建项目时,我们可停靠窗格关闭之后就无法显示了.即使重新编译项目也无法再次显示它们. 原因:因为MFC多文档把这些设置存储在注册表 “HKEY_CURRENT_USER \ SO ...

  10. java基础—线程(二)

    一.线程的优先级别