Description

我的室友最近喜欢上了一个可爱的小女生。马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一个送给她。每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度。但是在她生日的前一天,我的室友突然发现他好像拿错了一个手环,而且已经没时间去更换它了!他只能使用一种特殊的方法,将其中一个手环中所有装饰物的亮度增加一个相同的自然数 c(即非负整数)。并且由于这个手环是一个圆,可以以任意的角度旋转它,但是由于上面 装饰物的方向是固定的,所以手环不能翻转。需要在经过亮度改造和旋转之后,使得两个手环的差异值最小。在将两个手环旋转且装饰物对齐了之后,从对齐的某个位置开始逆时针方向对装饰物编号 1,2,…,n,其中 n 为每个手环的装饰物个数,第 1 个手环的 i 号位置装饰物亮度为 xi,第 2 个手 环的 i 号位置装饰物亮度为 yi,两个手环之间的差异值为(参见输入输出样例和样例解释): \sum_{i=1}^{n}(x_i-y_i)^2麻烦你帮他计算一下,进行调整(亮度改造和旋转),使得两个手环之间的差异值最小, 这个最小值是多少呢?

Input

输入数据的第一行有两个数n, m,代表每条手环的装饰物的数量为n,每个装饰物的初始 亮度小于等于m。
接下来两行,每行各有n个数,分别代表第一条手环和第二条手环上从某个位置开始逆时 针方向上各装饰物的亮度。
1≤n≤50000, 1≤m≤100, 1≤ai≤m

Output

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

Sample Input

5 6
1 2 3 4 5
6 3 3 4 5

Sample Output

1
【样例解释】
需要将第一个手环的亮度增加1,第一个手环的亮度变为: 2 3 4 5 6 旋转一下第二个手环。对于该样例,是将第二个手环的亮度6 3 3 4 5向左循环移动 2017-04-15 第 6 页,共 6 页 一个位置,使得第二手环的最终的亮度为:3 3 4 5 6。 此时两个手环的亮度差异值为1。

正解:$FFT$。

考场上切了这题,还是很高兴的。。

首先我们可以发现,一个手环最多$+m$,我们只要分别枚举每个手环加多少就行了。

我们只考虑$x$手环加数,因为$y$手环与$x$手环其实是一样的。

枚举$m$,那么$Ans=\sum_{i=1}^{n}(x_{i}+m-y_{i})^{2}$。我们把它拆开以后可以发现,$Ans=\sum_{i=1}^{n}(x_{i}+m)^{2}+y_{i}^{2}-2*y_{i}*x_{i}-2*y_{i}*m$。

容易发现,$2*x_{i}*y_{i}$是复杂度的瓶颈。其实这一项可以很容易看出是一个卷积,我们把另一个数组翻转一下,就能发现$\sum_{i=1}^{n}x_{i}*y_{i}$是一个卷积的形式,然后直接上$FFT$就能过了。

其实这题还有复杂度更优的$O(nlogn+n)$的做法,似乎是用二次函数的最值??不过$O(nlogn+nm)$也能过。。

 #include <algorithm>
#include <iostream>
#include <complex>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <set>
#define inf (2147483647)
#define N (100010)
#define il inline
#define RG register
#define ll long long
#define C complex <long double> using namespace std; const long double pi=acos(-1.0); int a[N],b[N],n,m; il int gi(){
RG int x=,q=; RG char ch=getchar();
while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-,ch=getchar();
return q*x;
} namespace brute{ int ans,res1,res2; il void work(){
ans=inf;
for (RG int i=;i<=n;++i) a[i]=gi(),a[n+i]=a[i],res1+=a[i]*a[i];
for (RG int i=;i<=n;++i) b[i]=gi(),b[n+i]=b[i],res2+=b[i]*b[i];
for (RG int k=;k<=m;++k){
for (RG int i=;i<=n;++i) a[i]+=k;
for (RG int i=;i<=n;++i){
RG int res=;
for (RG int j=;j<=n;++j) res+=(a[j]-b[i+j-])*(a[j]-b[i+j-]);
ans=min(ans,res);
}
for (RG int i=;i<=n;++i) a[i]-=k;
}
for (RG int k=;k<=m;++k){
for (RG int i=;i<=n;++i) b[i]+=k;
for (RG int i=;i<=n;++i){
RG int res=;
for (RG int j=;j<=n;++j) res+=(b[j]-a[i+j-])*(b[j]-a[i+j-]);
ans=min(ans,res);
}
for (RG int i=;i<=n;++i) b[i]-=k;
}
printf("%d\n",ans); return;
} } namespace cheat{ C A[*N],B[*N];
int rev[*N],NN,lg;
ll r1[N],r2[N],res1,res2,tot1,tot2,ans; il void fft(C *a,RG int n,RG int f){
for (RG int i=;i<n;++i) if (i<rev[i]) swap(a[i],a[rev[i]]);
for (RG int i=;i<n;i<<=){
C wn(cos(pi/i),sin(f*pi/i)),x,y;
for (RG int j=;j<n;j+=(i<<)){
C w(,);
for (RG int k=;k<i;++k,w*=wn){
x=a[j+k],y=w*a[j+k+i];
a[j+k]=x+y,a[j+k+i]=x-y;
}
}
}
return;
} il void work(){
for (RG int i=;i<=n;++i){
a[i]=gi(),A[i]=a[i];
res1+=a[i]*a[i],tot1+=a[i];
}
for (RG int i=;i<=n;++i){
b[i]=gi(),B[n-i+]=b[i];
res2+=b[i]*b[i],tot2+=b[i];
}
for (NN=;NN<=(n<<);NN<<=) lg++; ans=1LL<<;
for (RG int i=;i<NN;++i) rev[i]=rev[i>>]>>|((i&)<<(lg-));
fft(A,NN,),fft(B,NN,);
for (RG int i=;i<NN;++i) A[i]*=B[i]; fft(A,NN,-);
for (RG int i=n+;i<=(n<<);++i){
r1[i-n]=(ll)(A[i].real()/NN+0.5);
r1[i-n]+=(ll)(A[i-n].real()/NN+0.5);
}
memset(A,,sizeof(A)),memset(B,,sizeof(B));
for (RG int i=;i<=n;++i) A[n-i+]=a[i],B[i]=b[i];
fft(A,NN,),fft(B,NN,);
for (RG int i=;i<NN;++i) B[i]*=A[i]; fft(B,NN,-);
for (RG int i=n+;i<=(n<<);++i){
r2[i-n]=(ll)(B[i].real()/NN+0.5);
r2[i-n]+=(ll)(B[i-n].real()/NN+0.5);
}
for (RG ll k=;k<=m;++k){
RG ll cnt=res2;
for (RG int i=;i<=n;++i) cnt+=(a[i]+k)*(a[i]+k);
for (RG int i=;i<=n;++i) ans=min(ans,cnt-*(r1[i]+tot2*k));
}
for (RG ll k=;k<=m;++k){
RG ll cnt=res1;
for (RG int i=;i<=n;++i) cnt+=(b[i]+k)*(b[i]+k);
for (RG int i=;i<=n;++i) ans=min(ans,cnt-*(r2[i]+tot1*k));
}
printf("%lld\n",ans); return;
} } il void work(){
n=gi(),m=gi();
if (n<= && m<=){ brute::work(); return; }
cheat::work(); return;
} int main(){
freopen("gift.in","r",stdin);
freopen("gift.out","w",stdout);
work();
return ;
}

bzoj4827 [Hnoi2017]礼物的更多相关文章

  1. [bzoj4827][Hnoi2017]礼物_FFT

    礼物 bzoj-4827 Hnoi-2017 题目大意:给定两个长度为$n$的手环,第一个手环上的$n$个权值为$x_i$,第二个为$y_i$.现在我可以同时将所有的$x_i$同时加上自然数$c$.我 ...

  2. [BZOJ4827][Hnoi2017]礼物(FFT)

    4827: [Hnoi2017]礼物 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1315  Solved: 915[Submit][Status] ...

  3. BZOJ4827 [Hnoi2017]礼物 多项式 FFT

    原文链接http://www.cnblogs.com/zhouzhendong/p/8823962.html 题目传送门 - BZOJ4827 题意 有两个长为$n$的序列$x$和$y$,序列$x,y ...

  4. bzoj千题计划303:bzoj4827: [Hnoi2017]礼物

    https://www.lydsy.com/JudgeOnline/problem.php?id=4827 式子化简一下,发现最后只跟 Σ xi*yi 有关 第二个序列反转,就可以用FFT优化 注意: ...

  5. 2018.11.16 bzoj4827: [Hnoi2017]礼物(ntt)

    传送门 nttnttntt 入门题. 考虑展开要求的式子∑i=0n−1(xi−yi−c)2\sum_{i=0}^{n-1}(x_i-y_i-c)^2∑i=0n−1​(xi​−yi​−c)2 => ...

  6. BZOJ4827: [Hnoi2017]礼物(FFT 二次函数)

    题意 题目链接 Sol 越来越菜了..裸的FFT写了1h.. 思路比较简单,直接把 \(\sum (x_i - y_i + c)^2\) 拆开 发现能提出一坨东西,然后与c有关的部分是关于C的二次函数 ...

  7. BZOJ4827:[HNOI2017]礼物(FFT)

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

  8. 【BZOJ4827】 [Hnoi2017]礼物

    BZOJ4827 [Hnoi2017]礼物 Solution 如果一串数的增加,不就等于另一串数减吗? 那么我们可以把答案写成另一个形式: \(ans=\sum_{i=1}^n(x_i-y_i+C)^ ...

  9. bzoj 4827: [Hnoi2017]礼物 [fft]

    4827: [Hnoi2017]礼物 题意:略 以前做的了 化一化式子就是一个卷积和一些常数项 我记着确定调整值还要求一下导... #include <iostream> #include ...

随机推荐

  1. JSP文件转换成为JAVA文件后的结构

    public final class zzz_jsp extends HttpJspBase implements JspSourceDependent{ public void _jspInit() ...

  2. 解决input的回车enter和失焦blur冲突问题:实现回车保存,blur还原编辑内容功能

    最近做项目遇到: 背景:点击单元格,easyUI自动生成input可编辑框. 问题点:input的回车enter和失焦blur冲突问题:实现回车保存,blur还原编辑内容功能 要实现需求: 1.回车键 ...

  3. 转载 感受K2.Net 2003工作流解决方案

    接触SourceCode公司的工作流产品K2.NET 2003有一段时间了,想把一些心得分享出来,和各位共同探讨一下,抛砖引玉,希望能对相关人士以启发. K2.Net 2003是基于微软.Net Fr ...

  4. TensorFlow anaconda命令备忘

    [查看tensorflow安装的版本] anaconda search -t conda tensorflow [选择版本安装] conda install -c anaconda tensorflo ...

  5. Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)

    (一)Eclipse中的快捷键:  ctrl+shift+f自动整理选择的java代码 alt+/ 生成无参构造器或者提升信息 alt+shift+s+o 生成带参构造 ctrl+shift+o快速导 ...

  6. java类的equals()函数和hashCode()函数用法

    以前总觉得java类对象很简单,但是今天的一个同事的点播,让我对java的对象有了不一样的理解,下面我来介绍一下equals()和hashCode()的用法: 先粘一段代码: public class ...

  7. rsync+inotify实现文件同步更新(配置)

    linux下为了数据安全或者网站同步镜像,不得不考虑一些实时备份的问题,这篇linux下通过rsync+inotify 实现数据实时备份配置过程记录下来,防止遗忘配置过程记录下来,防止遗忘!如有建议技 ...

  8. 性能测试分享: Jmeter的源码分析main函数参数

    性能测试分享: Jmeter的源码分析main函数参数   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大 ...

  9. span表情输入框 --- Author: rose && lvyerose@163.com

        像QQ等社交聊天中,不可或缺的一部分就是我们常用的表情输入了,有时候有趣的表情同样能吸引住用户达到用户常驻的效果,当然,我们开发的时候不用去研究如何才能做到有趣,如何才能做到足够吸引用户,我们 ...

  10. 1132: 零起点学算法39——多组测试数据(a+b)

    1132: 零起点学算法39--多组测试数据(a+b) Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: ...