P3723 [AH2017/HNOI2017]礼物

题目描述

我的室友最近喜欢上了一个可爱的小女生。马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她。每个手环上各有 \(n\) 个装饰物,并且每个装饰物都有一定的亮度。

但是在她生日的前一天,我的室友突然发现他好像拿错了一个手环,而且已经没时间去更换它了!他只能使用一种特殊的方法,将其中一个手环中所有装饰物的亮度增加一个相同的自然数 \(c\)(即非负整数)。并且由于这个手环是一个圆,可以以任意的角度旋转它,但是由于上面装饰物的方向是固定的,所以手环不能翻转。需要在经过亮度改造和旋转之后,使得两个手环的差异值最小。

在将两个手环旋转且装饰物对齐了之后,从对齐的某个位置开始逆时针方向对装饰物编号\(1,2,\dots,n\),其中 \(n\) 为每个手环的装饰物个数, 第 \(1\) 个手环的 \(i\) 号位置装饰物亮度为 \(x_i\),第 \(2\) 个手环的 \(i\) 号位置装饰物亮度为 \(y_i\),两个手环之间的差异值为(参见输入输出样例和样例解释):

\(\sum_{i=1}^{n} (x_i-y_i)^2\)

麻烦你帮他计算一下,进行调整(亮度改造和旋转),使得两个手环之间的差异值最小,这个最小值是多少呢?

输入输出格式

输入格式:

输入数据的第一行有两个数\(n\), \(m\),代表每条手环的装饰物的数量为\(n\),每个装饰物的初始亮度小于等于\(m\)。

接下来两行,每行各有\(n\)个数,分别代表第一条手环和第二条手环上从某个位置开始逆时针方向上各装饰物的亮度。

输出格式:

输出一个数,表示两个手环能产生的最小差异值。注意在将手环改造之后,装饰物的亮度

可以大于 \(m\)。

说明

\(30\%\)的数据满足\(n\le500,m\le10\);

\(70\%\)的数据满足\(n\le5000\);

\(100\%\)的数据满足\(1\le n\le50000\), \(1\le m\le100\), \(1\le a_i\le m\)。


假设搞在\(x\)上,然后

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

\[=\sum x_i+\sum y_i+2c\sum x_i-y_i+nc^2-2\sum x_iy_i
\]

发现可以让\(c\)是负的然后搞在一个东西上,然后前面是二次函数可以直接搞。

注意取整数要讨论。

然后最大化后面的,考虑把它化成多项式相乘的形式,大概可以把一个数组倍长,另一个数组取反之类的。

其实方法不唯一,手玩一下就好了,然后我用了一种比较蠢的。


Code:

#include <cstdio>
#include <cmath>
#include <algorithm>
#define ll long long
const int N=(1<<18)+10;
using std::max;
using std::min;
struct complex
{
double x,y;
complex(){}
complex(double x,double y){this->x=x,this->y=y;}
complex friend operator +(complex n1,complex n2){return complex(n1.x+n2.x,n1.y+n2.y);}
complex friend operator -(complex n1,complex n2){return complex(n1.x-n2.x,n1.y-n2.y);}
complex friend operator *(complex n1,complex n2){return complex(n1.x*n2.x-n1.y*n2.y,n1.x*n2.y+n1.y*n2.x);}
}a[N],b[N],tmpx,tmpy,w,wn;
int n,m,turn[N],x[N],y[N],A,B,len=1,L=-1;
ll sum=0x7fffffffffffffffll;
const double pi=3.1415926535897;
void FFT(complex *a,int typ)
{
for(int i=0;i<len;i++)
if(i<turn[i])
std::swap(a[i],a[turn[i]]);
for(int le=1;le<len;le<<=1)
{
wn=complex(cos(pi/le),typ*sin(pi/le));
for(int p=0;p<len;p+=le<<1)
{
w=complex(1,0);
for(int i=p;i<p+le;i++,w=w*wn)
{
tmpx=a[i],tmpy=w*a[i+le];
a[i]=tmpx+tmpy;
a[i+le]=tmpx-tmpy;
}
}
}
}
void chkmin(int c){sum=min(sum,1ll*A+2*c*B+n*c*c);}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",x+i),B+=x[i],A+=x[i]*x[i];
for(int i=1;i<=n;i++) scanf("%d",y+i),B-=y[i],A+=y[i]*y[i];
int c=-B/n;
chkmin(c);chkmin(c+1);chkmin(c-1);
for(int i=1;i<=n;i++)
{
a[i]=complex(x[i],0),b[i]=complex(y[n+1-i],0);
a[i+n]=a[i],b[i+n]=b[i];
}
m=n<<1;
while(len<=m<<1) len<<=1,++L;
for(int i=0;i<len;i++) turn[i]=turn[i>>1]>>1|(i&1)<<L;
FFT(a,1),FFT(b,1);
for(int i=0;i<len;i++) a[i]=a[i]*b[i];
FFT(a,-1);
ll mx=0;
for(int i=n+1;i<=m;i++)
mx=max(mx,(ll)(a[i].x/len+0.5)-(ll)(a[i-n].x/len+0.5));
mx=mx*2;
printf("%lld\n",1ll*sum-mx);
return 0;
}

2018.12.3

最新文章

  1. iOS推送证书转pem文件
  2. [项目]WebService涉及到的部分核心代码
  3. BZOJ3438 小M的作物(最小割)
  4. [Config]Zabbix的Mongodb插件安装,centos
  5. QT入门
  6. asp.net ajax 调用一例
  7. 又一枚神器:nginx
  8. HDU4614 Vases and Flowers
  9. asp.net 163邮件发送
  10. FMDB官方使用文档-GCD的使用-提高性能(翻译)
  11. linux cmd: ps
  12. [转]Disabling ASLR on individual iOS applications when using iOS 6.0.1
  13. CocoaPods安装和使用及问题----看过写的最好的
  14. java 集合框架(List操作)
  15. O2O、B2B、C2C(通俗讲解)
  16. nginx配置二级目录,反向代理不同ip+端口
  17. L2-007 家庭房产 (25 分)
  18. css实现不定高度的元素垂直居中问题
  19. Filter(转载)
  20. 中国将有可能在全球化的背景下收获新的人口红利:3星|《&lt;财经&gt;2019:预测与战略》

热门文章

  1. c++中的stack实现
  2. com.genuitec.runtime.generic.jee60 is not defined 导入项目的异常
  3. json_encode替代函数
  4. 在香港网站使用工商银行的MasterCard,工商银行所犯的低级的错误,金融安全何在
  5. loadrunner socket协议问题归纳(5)
  6. Beta冲刺第二周王者荣耀交流协会第四次会议
  7. 《JavaScript》JavaScript的名字和版本
  8. c# 捕获一般获取不到的异常
  9. Codeforces Beta Round #14 (Div. 2) D. Two Paths 树的直径
  10. 周总结&lt;4&gt;