[HNOI2017]礼物
Description:
给定两个有n个数的序列,你可以将其中一个进行旋转(想象是在一个环上),或者对序列的每个数加上一个非负整数C
求操作后 \(\sum{(a_i-b_i)^2}\)的最小值
Description:
\(n<=5*10^4,m<=100,a_i<=m\)
Solution:
一眼看去,十分不可做,于是开始拆式子
\(\sum(a_i-b_i+C)^2\)
\(=\sum a_i^2 +\sum b_i^2+2*\sum (a_i-b_i)*C +n*C^2-2*\sum a_ib_i\)
由于 \(m\) 很小,我们考虑枚举 C
然后只要求出 \(2*\sum a_ib_i\) 的最大值就行了
将 b 数组翻转
即求 $ \sum a_ib_{n-i+1}$ 最大值
如何求 ?
将 a 数组倍长
由卷积的定义,FFT后对于 n+1 到 2*n 得到的数就分别对应所有的旋转
checkmax 即可
#include<bits/stdc++.h>
using namespace std;
const int mxn=1e6+5;
const double PI=acos(-1);
int n,m,l,s1,s2,s3,lim=1,r[mxn],tp[mxn];
int ans,res=100000000;
struct cp {
double x,y;
cp(double xx=0,double yy=0) {x=xx,y=yy;}
friend cp operator + (cp a,cp b) {
return cp(a.x+b.x,a.y+b.y);
}
friend cp operator - (cp a,cp b) {
return cp(a.x-b.x,a.y-b.y);
}
friend cp operator * (cp a,cp b) {
return cp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
}
}a[mxn],b[mxn];
void FFT(cp *p,int opt)
{
for(int i=0;i<=lim;++i)
if(i<r[i]) swap(p[i],p[r[i]]);
for(int mid=1;mid<lim;mid<<=1) {
cp wn(cos(PI/mid),opt*sin(PI/mid));
for(int len=mid<<1,j=0;j<lim;j+=len) {
cp w(1,0);
for(int k=0;k<mid;++k,w=w*wn) {
cp x=p[j+k],y=w*p[j+mid+k];
p[j+k]=x+y,p[j+mid+k]=x-y;
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) {
scanf("%lf",&a[i].x);
a[i+n].x=a[i].x;
ans+=a[i].x*a[i].x;
s1+=a[i].x;
}
for(int i=1;i<=n;++i) {
scanf("%d",&tp[i]);
ans+=tp[i]*tp[i];
s2+=tp[i];
}
for(int i=1;i<=n;++i) {
b[i].x=tp[n-i+1];
}
while(lim<=3*n) lim<<=1,++l;
for(int i=0;i<lim;++i)
r[i]=(r[i>>1]>>1)|((i&1)<<(l-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 i=n+1;i<=n*2;++i) s3=max(s3,(int )(a[i].x/lim+0.5));
ans-=2*s3;
for(int i=-m;i<=m;++i) res=min(res,n*i*i+2*(s1-s2)*i);
printf("%d",res+ans);
return 0;
}
[HNOI2017]礼物的更多相关文章
- bzoj 4827: [Hnoi2017]礼物 [fft]
4827: [Hnoi2017]礼物 题意:略 以前做的了 化一化式子就是一个卷积和一些常数项 我记着确定调整值还要求一下导... #include <iostream> #include ...
- P3723 [AH2017/HNOI2017]礼物
题目链接:[AH2017/HNOI2017]礼物 题意: 两个环x, y 长度都为n k可取 0 ~ n - 1 c可取任意值 求 ∑ ( x[i] - y[(i + k) % n + 1] ...
- 【BZOJ4827】 [Hnoi2017]礼物
BZOJ4827 [Hnoi2017]礼物 Solution 如果一串数的增加,不就等于另一串数减吗? 那么我们可以把答案写成另一个形式: \(ans=\sum_{i=1}^n(x_i-y_i+C)^ ...
- 4827: [Hnoi2017]礼物
4827: [Hnoi2017]礼物 链接 分析: 求最小的$\sum_{i=1}^{n}(x_i-y_i)^2$ 设旋转了j位,每一位加上了c. $\sum\limits_{i=1}^{n}(x_{ ...
- 【LG3723】[AHOI2017/HNOI2017]礼物
[LG3723][AHOI2017/HNOI2017]礼物 题面 洛谷 题解 首先我们将\(c\)看作一个可以为负的整数,那么我们就可以省去讨论在哪个手环加\(c\)的繁琐步骤了 设我们当前已经选好了 ...
- 洛谷 P3723 [AH2017/HNOI2017]礼物 解题报告
P3723 [AH2017/HNOI2017]礼物 题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个 ...
- [BZOJ4827][Hnoi2017]礼物(FFT)
4827: [Hnoi2017]礼物 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1315 Solved: 915[Submit][Status] ...
- [Luogu P3723] [AH2017/HNOI2017]礼物 (FFT 卷积)
题面 传送门:洛咕 Solution 调得我头大,我好菜啊 好吧,我们来颓柿子吧: 我们可以只旋转其中一个手环.对于亮度的问题,因为可以在两个串上增加亮度,我们也可以看做是可以为负数的. 所以说,我们 ...
- 笔记-[AH2017/HNOI2017]礼物
笔记-[AH2017/HNOI2017]礼物 [AH2017/HNOI2017]礼物 \[\begin{split} ans_i=&\sum_{j=1}^n(a_j-b_j+i)^2\\ =& ...
- [bzoj4827][Hnoi2017]礼物_FFT
礼物 bzoj-4827 Hnoi-2017 题目大意:给定两个长度为$n$的手环,第一个手环上的$n$个权值为$x_i$,第二个为$y_i$.现在我可以同时将所有的$x_i$同时加上自然数$c$.我 ...
随机推荐
- matlab转c++代码实现(主要包含C++ std::vector,std::pair学习,包含数组与常数相乘,数组相加减,将数组拉成一维向量,图片的读入等内容)
MATLAB部分: xmap = repmat( linspace( -regionW/2, regionW/2, regionW), regionH, 1 );%linspace [x1,x2,N] ...
- C/C++内存管理器
C标准库提供了malloc,free,calloc,realloc,C++标准库还提供了new, new[], delete, delete[].这些用来管理内存,看起来够用了,为啥还要自己写一个内存 ...
- 记录mysql正在执行的SQL语句
show variables like "general_log%"; SET GLOBAL general_log = 'ON';SET GLOBAL general_log = ...
- 腾讯云Ubuntu安装可视化桌面
1.安装图形界面 sudo apt-get update 更新 1).sudo apt-get install xinit 2).sudo apt-get install gdm ( 登陆窗口,用于 ...
- C#获取一周的工作日显示(星期几)
代码如下: gridBandW1.Caption = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetDayName ...
- .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服务
.NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...
- 学习笔记: 反射应用、原理,完成扩展,emit动态代码
using Ruanmou.DB.Interface; using Ruanmou.DB.MySql; using Ruanmou.DB.SqlServer; using Ruanmou.Model; ...
- Spring Boot JPA的Column Table 注解命名字段无效
@Table(name = "OrderInfo") @Entity public class OrderInfo { @Id @GeneratedValue private Lo ...
- sendfile
Sendfile 函数在两个文件描写叙述符之间直接传递数据(全然在内核中操作,传送),从而避免了内核缓冲区数据和用户缓冲区数据之间的拷贝,操作效率非常高,被称之为零拷贝. Sendfile 函数的定义 ...
- Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第十集之Nginx反向代理原理】(有参考其他文章)
1,正向代理(代理客户机) 2,反向代理(代理服务器,所以叫反向代理) 3,集群+负载均衡 集群指的是将几台服务器集中在一起,实现同一业务. 负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台 ...