bzoj 4827 礼物
bzoj 4827 礼物
- 可以看做将其中一个数列(假定为 \(a\) )都加上 \(c\) , \(c\) 可以为负数.易知这里 \(-m\leq c\leq m\).
- 记要求的答案为 \(ans\) , 大力拆开括号可得:
\]
- 这里的 \(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 礼物的更多相关文章
- bzoj 3055礼物运送 floyed + 状压DP
bzoj 3055: 礼物运送 floyed first 设f[i][S]表示取到了S集合中的所有点(不一定是经过的所有点),最后停在了i的最优值. 初始就f[i][{i}] = dis[1][i] ...
- bzoj 4827: [Hnoi2017]礼物 [fft]
4827: [Hnoi2017]礼物 题意:略 以前做的了 化一化式子就是一个卷积和一些常数项 我记着确定调整值还要求一下导... #include <iostream> #include ...
- bzoj 4827 [Hnoi2017]礼物——FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4827 式子就是 \sum_{i=0}^{n-1}(a[ i ] - b[ i+k ] + c ...
- bzoj 4827 [Hnoi2017] 礼物 —— FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4827 首先,旋转对应,可以把 b 序列扩展成2倍,则 a 序列对应到的还是一段区间: 再把 ...
- bzoj 4827: [HNOI2017]礼物 (FFT)
一道FFT 然而据说暴力可以水70分 然而我省选的时候看到了直接吓傻了 连暴力都没打 太弱了啊QAQ emmmm 详细的拆开就看其他题解吧233 最后那一步卷积其实我一直没明白 后来画画图终于懂了 ...
- BZOJ:4827: [Hnoi2017]礼物
[问题描述] 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度. 但是在她生日的 ...
- 【刷题】BZOJ 4827 [Hnoi2017]礼物
Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在 ...
- BZOJ 4827 [Hnoi2017]礼物 ——FFT
题目上要求一个循环卷积的最小值,直接破环成链然后FFT就可以了. 然后考虑计算的式子,可以分成两个部分分开计算. 前半部分FFT,后半部分扫一遍. #include <map> #incl ...
- bzoj 4827: [Hnoi2017]礼物【FFT】
记得FFT要开大数组!!开到快MLE的那种!!我这个就是例子TAT,5e5都RE了 在这题上花的时间太多了,还是FFT不太熟练. 首先看70分的n方做法:从0下标开始存,先n--,把a数组倍增,然后枚 ...
随机推荐
- [小问题笔记(十)] SQL Server 里 float 转 varchar等字符类型 不使用科学计数法
需要转换两次, 试了一下 float 转 bigint 转 varchar 溢出了... 后来用 float 转 decimal(38,0) 转 varchar 就成功了~ ,)) )) 另吐槽一下 ...
- 06_zookeeper_原生API使用2
1. 设置znode节点数据(同步) import org.apache.zookeeper.*; import org.apache.zookeeper.data.Stat; import java ...
- WebBrowser提交submit后界面不刷新的解决办法
一个Form里有一个WebBrowser和一个Button,在Button_Click里执行 htmlDocument=WebBrowser.Document得到当前document 当htmlDoc ...
- 微信小程序------联动选择器
picker 从底部弹起的滚动选择器,现支持五种选择器,通过mode来区分,分别是普通选择器,多列选择器,时间选择器,日期选择器,省市区选择器,默认是普通选择器. 先来看看效果图: 1:普通选择器 m ...
- 几款必备LINUX的命令行神器
Dstat & sar iostat, vmstat, ifstat 三合一的工具,用来查看系统性能(我在<性能调优攻略>中提到过那三个xxstat工具). 官方网站:http:/ ...
- mysql 5.1.71升级到5.6.30
mysql 5.1.71升级到5.6.30 mysqldump -h主机名 -P端口 -u用户名 -p密码 (–database) 数据库名 > 文件名.sql 备份MySQL数据库的命令 my ...
- Prism 4 文档 ---第8章 导航
作为同用户具有丰富的交互的客户端应用程序,它的用户界面(UI)将会持续不断的更新来反映用户工作的当前的任务和数据.用户界面可以进行一段时间相当大的变化作为用户交互的应用程序中完成各种任务.通过 ...
- CF445
题解: xjb乱判断一下就可以了 代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; int n, ...
- 第1课:接口测试和jmeter总结
接口测试 1. 接口的分类:webService和http api接口 1) webService接口:是按照soap协议通过http传输,请求报文和返回报文都是xml格式,一般要借助工具来测试接口: ...
- java语言基础-变量
一丶变量的基本概念 1.什么是变量 (1).内存中的一个存储区域 (2).该区域有自己的名称(变量名),和类型(数据类型) (3.)该区域的数据可以在同一类型范围内不断变化(定义变量的主要目的是因为数 ...