bzoj 4827 礼物

  • 可以看做将其中一个数列(假定为 \(a\) )都加上 \(c\) , \(c\) 可以为负数.易知这里 \(-m\leq c\leq m\).
  • 记要求的答案为 \(ans\) , 大力拆开括号可得:

\[ans=\sum{(a_i+c-b_i)^2}\\=\sum a_i^2+\sum b_i^2+n\cdot c^2+2c\cdot (\sum a_i-\sum b_i)-2\sum a_i b_i.
\]

  • 这里的 \(a,b\) 是原数列元素不变,通过旋转得到的.
  • 其中前两项是确定的,中间两项只与 \(c\) 有关,最后一项只与旋转方式有关.
  • \(c\) 的取值范围很小,可以枚举 \(c\) 求中间两项的最小值,而求最后一项的最大值,有一个做法:
  • 将 \(a\) 翻转后重复一次,即拼接成 \(a'=a^Ra^R\),做卷积 \(a''=a'\otimes b\), 则 \(a''\) 的 \(n+1\) 至 \(2n\) 的项恰好对应了通过每种旋转方式后的 \(\sum a_i b_i\) ,可以通过验证得出.对这些项取一个最大值即可.
  • 用 \(FFT\) 加速卷积过程,总时间复杂度为 \(O(nlogn)\) .
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pii pair<int,int>
#define max(a,b) ((a) < (b) ? b : a)
#define min(a,b) ((a) < (b) ? a : b)
inline int read()
{
int x=0;
bool pos=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
pos=0;
for(;isdigit(ch);ch=getchar())
x=x*10+ch-'0';
return pos?x:-x;
}
void write(int x)
{
if(x>=10)
write(x/10);
putchar(x%10+'0');
}
void writeln(int x)
{
write(x);
puts("");
}
struct cp{
double x,y;
cp(double xx=0,double yy=0){x=xx;y=yy;}
cp operator +(const cp &b){return cp(x+b.x,y+b.y);}
cp operator -(const cp &b){return cp(x-b.x,y-b.y);}
cp operator *(const cp &b){return cp(x*b.x-y*b.y,x*b.y+y*b.x);}
};
const double PI=acos(-1.0);
const int MAXN=6e5+10;
cp omega[MAXN],inv[MAXN];
int rev[MAXN];
void init(int n,int lim)
{
for(int i=0; i<n; ++i)
{
for(int j=0; j<lim; ++j)
if((i>>j)&1)
rev[i]|=1<<(lim-j-1);
}
}
void FFT(cp *a,int n,bool invflag)
{
for(int i=0; i<n; ++i)
{
if(i<rev[i])
swap(a[i],a[rev[i]]);
}
for(int l=2; l<=n; l<<=1)
{
int m=l>>1;
cp wi=cp(cos(2*PI/l),sin(2*PI/l));
if(invflag)
wi=cp(cos(2*PI/l),-sin(2*PI/l));
for(int p=0; p<n; p+=l)
{
cp w=cp(1,0);
for(int i=0; i<m; ++i)
{
cp t=w*a[i+m+p];
a[i+m+p]=a[i+p]-t;
a[i+p]=a[i+p]+t;
w=w*wi;
}
}
}
if(invflag)
{
for(int i=0; i<n; ++i)
a[i].x/=n,a[i].y/=n;
}
}
ll suma=0,sumb=0,sqa=0,sqb=0,sdif=0,mulmax=0;
int n,m;
cp a[MAXN],b[MAXN];
int main()
{
n=read(),m=read();
for(int i=0;i<n;++i)
{
int x=read();
a[i]=x;
suma+=x;
sqa+=x*x;
}
reverse(a,a+n);
for(int i=n;i<2*n;++i)
a[i]=a[i-n];
for(int i=0;i<n;++i)
{
int x=read();
b[i]=x;
sumb+=x;
sqb+=x*x;
}
sdif=suma-sumb;
int N=1,lim=0;
while(N<3*n)
N<<=1,++lim;
init(N,lim);
FFT(a,N,0);
FFT(b,N,0);
for(int i=0;i<N;++i)
a[i]=a[i]*b[i];
FFT(a,N,1);
for(int i=n;i<2*n;++i)
mulmax=max(mulmax,(long long)(a[i].x+0.5));
ll ans=1e18;
for(int c=-m;c<=m;++c)
ans=min(ans,sqa+sqb+n*c*c+2*c*sdif-2*mulmax);
printf("%lld\n",ans);
return 0;
}

bzoj 4827 礼物的更多相关文章

  1. bzoj 3055礼物运送 floyed + 状压DP

    bzoj 3055: 礼物运送 floyed first 设f[i][S]表示取到了S集合中的所有点(不一定是经过的所有点),最后停在了i的最优值. 初始就f[i][{i}] = dis[1][i] ...

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

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

  3. bzoj 4827 [Hnoi2017]礼物——FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4827 式子就是 \sum_{i=0}^{n-1}(a[ i ] - b[ i+k ] + c ...

  4. bzoj 4827 [Hnoi2017] 礼物 —— FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4827 首先,旋转对应,可以把 b 序列扩展成2倍,则 a 序列对应到的还是一段区间: 再把 ...

  5. bzoj 4827: [HNOI2017]礼物 (FFT)

    一道FFT 然而据说暴力可以水70分 然而我省选的时候看到了直接吓傻了  连暴力都没打 太弱了啊QAQ emmmm 详细的拆开就看其他题解吧233 最后那一步卷积其实我一直没明白 后来画画图终于懂了 ...

  6. BZOJ:4827: [Hnoi2017]礼物

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

  7. 【刷题】BZOJ 4827 [Hnoi2017]礼物

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

  8. BZOJ 4827 [Hnoi2017]礼物 ——FFT

    题目上要求一个循环卷积的最小值,直接破环成链然后FFT就可以了. 然后考虑计算的式子,可以分成两个部分分开计算. 前半部分FFT,后半部分扫一遍. #include <map> #incl ...

  9. bzoj 4827: [Hnoi2017]礼物【FFT】

    记得FFT要开大数组!!开到快MLE的那种!!我这个就是例子TAT,5e5都RE了 在这题上花的时间太多了,还是FFT不太熟练. 首先看70分的n方做法:从0下标开始存,先n--,把a数组倍增,然后枚 ...

随机推荐

  1. 06_zookeeper_原生API使用2

    1. 设置znode节点数据(同步) import org.apache.zookeeper.*; import org.apache.zookeeper.data.Stat; import java ...

  2. WPF圆角透明无边框窗体

    <Window x:Class="ImportData.MainWindow" xmlns="http://schemas.microsoft.com/winfx/ ...

  3. 锁(1)-- java锁

    前言: 锁分3种:java锁.分布式锁.DB锁 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁 ...

  4. 从Github上轻松安装R包—githubinstall包--转载

    1.综述 越来越多的R包正在由世界上不同的人所创建,其中一部分原因是devtools包使得开发R包1变得更加简单.devtools包不仅让开发R包变得简单,而且用于分发R包. 当开发者发布一个R包的时 ...

  5. 机器学习经典书籍&论文

    原文地址:http://blog.sina.com.cn/s/blog_7e5f32ff0102vlgj.html 入门书单 1.<数学之美>PDF6 作者吴军大家都很熟悉.以极为通俗的语 ...

  6. 【Python】解决Python脚本 在cmd命令行窗口运行时,中文乱码问题

    问题描述 python2.X,代码中指定了UTF-8,但是在cmd命令行窗口时,打印的中文仍然会乱码 在python3不存在该问题 运行结果: 原因 搜索得知,中文windows默认的输出编码为gbk ...

  7. PHP处理MySQL事务代码

    php使用mysqli进行事务处理 <?php$db = new mysqli("localhost","root",""," ...

  8. [Vue]webpack的require与require.context

    1.require 1.1完整路径的require语句: require('tools'); //preset alias tools require('./js/main'); 1.2带表达式的 r ...

  9. 创建mysql表

    CREATE TABLE `t_play_product` ( `product_id` ) NOT NULL AUTO_INCREMENT COMMENT '主键ID,自增', `product_n ...

  10. IOS UI-UISearchController

    ViewController.m // // ViewController.m // IOS_0224_查找联系人 // // Created by ma c on 16/2/24. // Copyr ...