题目链接

戳我

\(Solution\)

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

\[\sum_{i=1}^{n}(x_i-y_i+z)^2
\]

首先来化简一下式子

\[\sum_{i=1}^{n}(x_i-y_i+z)^2
\]

\[\sum_{i=1}^{n}x_i^2+\sum_{i=1}^{n}y_i^2+\sum_{i=1}^{n}z_i^2+2z\sum_{i=1}^{n}(x_i-y_i)-2\sum_{i=1}^{n}x_i*y_i
\]

我们可以发现不管如何变化\(\sum_{i=1}^{n}x_i^2+\sum_{i=1}^{n}y_i^2\)的值都不会变.

然后再看看\(\sum_{i=1}^{n}z_i^2+2z\sum_{i=1}^{n}(x_i-y_i)\)显然这是一个关于\(z\)的二次函数.最小值可以\(O(1)\)算出但是注意一下\(z\)必须是整数而且可以为负,所以需要将\(-\frac{x_i-y_i}{n}\)向上和向下取整并带入式子取最小值.

所以我们现在只需要算出\(2\sum_{i=1}^{n}x_i*y_i\)的最大值即可.

这个如何去算,将\(y\)变成链,在进行一次\(fft\)在取一个最大值就好了

\(Code\)

#include<bits/stdc++.h>
#define int long long
#define rg register
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return f*x;
}
const int N=3000001;
const double pi=3.14159265358979323846;
struct node {
double x,y;
node operator + (node z)const {
return (node){x+z.x,y+z.y};
}
node operator - (node z)const {
return (node){x-z.x,y-z.y};
}
node operator * (node z)const {
return (node){x*z.x-y*z.y,y*z.x+x*z.y};
}
}f[N],g[N];
int r[N],limit=1;
void fft(node *a,int opt){
for(int i=0;i<=limit;i++)
if(i<r[i])
swap(a[i],a[r[i]]);
for(int i=1;i<limit;i<<=1){
node w=(node){cos(pi/i),opt*sin(pi/i)};
for(int j=0;j<limit;j+=i<<1){
node l=(node){1,0};
for(int k=j;k<j+i;k++){
node p=l*a[k+i];
a[k+i]=a[k]-p;
a[k]=a[k]+p;
l=l*w;
}
}
}
}
int a[N],b[N];
main(){
int n=read(),k=read(),l=0,m=n,js=0,ans=0;
for(int i=1;i<=n;i++)
a[i]=f[i].x=read(),f[i+n].x=f[i].x,js+=a[i],ans+=a[i]*a[i];
for(int i=1;i<=n;i++)
b[i]=read(),js-=b[i],ans+=b[i]*b[i];
reverse(b+1,b+n+1);
for(int i=1;i<=n;i++)
g[i].x=b[i];
int A=-floor(js*1.0/n),B=-ceil(js*1.0/n);
ans+=min(A*A*n+2*A*js,B*B*n+2*B*js);
n*=2;
while(limit<=n+m)
limit<<=1,l++;
for(int i=0;i<limit;i++)
r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
fft(f,1),fft(g,1);
for(int i=0;i<=limit;i++)
f[i]=f[i]*g[i];
fft(f,-1);
int maxx=0;
for(int i=m;i<=n+1;i++)
maxx=max((int)(f[i].x/limit+0.5),maxx);
printf("%lld",ans-2*maxx);
}

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

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

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

  2. 「AHOI / HNOI2017」礼物

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

  3. 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+\ ...

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

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

  5. 「AHOI / HNOI2017」单旋

    「AHOI / HNOI2017」单旋 题目链接 H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种 ...

  6. 「AHOI / HNOI2017」影魔

    「AHOI / HNOI2017」影魔 题目描述 解决这类比较复杂的区间贡献问题关键在于找到计算的对象. 比如这道题,我们计算的对象就是区间中间的最大值. 对于点\(i\),我们找到左边第一个比他大的 ...

  7. loj #2023. 「AHOI / HNOI2017」抛硬币

    #2023. 「AHOI / HNOI2017」抛硬币   题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个 ...

  8. loj #2021. 「AHOI / HNOI2017」大佬

    #2021. 「AHOI / HNOI2017」大佬   题目描述 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢 ...

  9. [LOJ 2022]「AHOI / HNOI2017」队长快跑

    [LOJ 2022]「AHOI / HNOI2017」队长快跑 链接 链接 题解 不难看出,除了影响到起点和终点的射线以外,射线的角度没有意义,因为如果一定要从该射线的射出一侧过去,必然会撞到射线 因 ...

随机推荐

  1. 多重继承 -Javascript中的apply与call详解

    举例 //定义一个函数 function add(x, y) { return x + y; } //用call 来调用 function myAddCall(x, y) { //调用 add 方法 ...

  2. 【转】c++虚函数实现原理

    原文链接:https://blog.csdn.net/neiloid/article/details/6934135 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指 ...

  3. objective-C: NSString应该用initWithFormat? 还是 stringWithFormat?

    今天在看书上的一段代码时,发现NSString实例化时,有时用的是initWithFormat方法,有时用的是stringWithFormat,到底应该如何选择呢? 区别: 1.initWithFor ...

  4. 拼接sql

    String whereArgs = taskTable + " where 1=1 "; if (upCheck) { whereArgs += " and type ...

  5. linux系统文件属性详解

    一.文件信息 当创建一个文件的时候,系统保存了有关该文件的全部信息,包括: 文件的位置: 文件类型: 文件长度: 哪位用户拥有该文件,哪些用户可以访问该文件: 硬连接计数: 文件的修改时间: 文件的权 ...

  6. WebSocket 教程(转载)

    WebSocket 教程   作者: 阮一峰 日期: 2017年5月15日 WebSocket 是一种网络通信协议,很多高级功能都需要它. 本文介绍 WebSocket 协议的使用方法. 一.为什么需 ...

  7. 白盒测试实践-任务进度-Day01

    12-05 任务安排 小组成员 华同学.郭同学.覃同学.刘同学.穆同学.沈同学 任务划分 任务1:依据白盒测试方法设计测试用例 说明:我们小组就不使用测试管理工具了,直接用excel文件的形式记录,具 ...

  8. Web测试项目计划与安排

    本次Web测试项目实践的需求如下: 1 选中某一款产品(暂且选择博客园和CSDN进行横向比较),对被测产品进行评测: 2 进行用户调研: 3 对产品进行定量的评价: 4 对这个产品进行分析: 5 例会 ...

  9. yii\bootstrap

    yii\bootstrap\ButtonDropdown <?php echo yii\bootstrap\ButtonDropdown::widget([ 'label' => 'Act ...

  10. 10.13DOM中document--文档1找到元素的方法,还有元素内容属性

    今天讲了js的组成部分中的第二组成部分(DOM),DOM包括以下内容: window    -- 窗口                                                 ...