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数组倍增,然后枚 ...
随机推荐
- 直播P2P技术2-低延迟模型
低延迟模型 由上一篇文章我们知道:网状拓扑虽最大化利用了所有节点的资源却无法降低数据延迟,而树状拓扑尽管数据传输效率高,延迟低,但只利用了少部分节点的带宽资源,不适应高码率的直播P2P网络. 那么如何 ...
- pg_ctl -- 启动、停止、重启 PostgreSQL
pg_ctl 名称 pg_ctl -- 启动.停止.重启 PostgreSQL 语法 pg_ctl start [-w] [-s] [-D datadir] [-l filename] [-o opt ...
- 关于SpringMVC中两种映射器不能共存的解决
首先大家都知道SpringMVC有两种映射器: org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping 和 org.spri ...
- svn diff color
大致有两种方式: 1,在bashrc中添加如下脚本 svndiff() { svn diff "${@}" | colordiff } 2,修改svn的配置文件 $ vim ~/. ...
- KVM与XEN虚拟化环境究竟有何不同
虚拟化的概念在近些年收到了很大程度上的普及,求其原因很简单:虚拟化能够最大程度利用资源,为企业节约成本.目前市面较受欢迎的虚拟架构主要有KVM.XEN和VMware,其中,KVM和XEN都是免费开源的 ...
- 三十 Python分布式爬虫打造搜索引擎Scrapy精讲—将selenium操作谷歌浏览器集成到scrapy中
1.爬虫文件 dispatcher.connect()信号分发器,第一个参数信号触发函数,第二个参数是触发信号,signals.spider_closed是爬虫结束信号 # -*- coding: u ...
- 牛客-https://www.nowcoder.com/acm/contest/96/H
链接:https://www.nowcoder.com/acm/contest/96/H来源:牛客网 题目描述 今天qwb要参加一个数学考试,这套试卷一共有n道题,每道题qwb能获得的分数为ai,qw ...
- mongodb安装与权限配置
mongodb下载地址:官方下载IDE工具:Robo 3T:官方下载 windows系统要求64位,最低2g内存,推荐8g内存及以上 安装过程没有需要配置的地方,直接下一步到结束,如果想要方便可以在环 ...
- [nodejs]npm国内npm安装nodejs modules终极解决方案
此方案用于设置代理和修改镜像地址都不能解决问题使用 1.npm root 确认node模块的根文件夹,全局要加-g. osx同样是此命令,先清除缓存. npm cache clean C:\Users ...
- MVC,MVVM,MVP等设计模式的分析
从Script到Code Blocks.Code Behind到MVC.MVP.MVVM 三个模式按照大致的历史进程将这些概念进行划分: Script Code Blocks.Code Behind ...