LUOGU P3723 [AH2017/HNOI2017]礼物 (fft)
解题思路
首先我们设变化量为\(r\),那么最终的答案就可以写成 :
\]
\]
继续化简:
\]
\]
这样我们就可以发现,第一部分是一个定值,第二部分只需要从\(-m\)到\(m\)枚举一下\(r\)就能算出,现在问题就是算第三部分。发现第三部分形式特别像卷积,就直接将\(a\)数组翻一下倍,表示旋转,\(b\)数字翻转一下。然后\(fft\)后算一个最大值即可。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN = 50005<<3;
const double Pi=acos(-1);
typedef long long LL;
inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
int n,m,limit=1,rev[MAXN];
LL ans,sqA,sqB,A,B,Sum=1e18;
struct Complex{
double x,y;
Complex(double xx=0,double yy=0) {x=xx;y=yy;}
}a[MAXN],b[MAXN];
Complex operator +(const Complex A,const Complex B) {return Complex(A.x+B.x,A.y+B.y);}
Complex operator -(const Complex A,const Complex B) {return Complex(A.x-B.x,A.y-B.y);}
Complex operator *(const Complex A,const Complex B) {return Complex(A.x*B.x-A.y*B.y,A.x*B.y+A.y*B.x);}
inline void fft(Complex *f,int type){
for(int i=0;i<limit;i++)
if(i<rev[i]) swap(f[i],f[rev[i]]);
int len;Complex Wn,w,tmp;
for(int p=2;p<=limit;p<<=1){
len=p>>1;Wn=Complex(cos(Pi/len),type*sin(Pi/len));
for(int k=0;k<limit;k+=p){
w=Complex(1,0);
for(int l=k;l<k+len;l++){
tmp=f[l+len]*w;
f[l+len]=f[l]-tmp;f[l]=f[l]+tmp;
w=w*Wn;
}
}
}
}
int main(){
n=rd(),m=rd();int x;
for(int i=1;i<=n;i++) {
x=rd();sqA+=x*x;A+=x;a[i].x=(double)x;
}
for(int i=1;i<=n;i++) {
x=rd();sqB+=x*x;B+=x;b[n-i+1].x=(double)x;
}
for(int i=1;i<=n;i++) a[i+n].x=a[i].x;
while(limit<=3*n) limit<<=1;
for(int i=0;i<limit;i++) rev[i]=(rev[i>>1]>>1)|((i&1)?limit>>1:0);
fft(a,1);fft(b,1);for(int i=0;i<limit;i++) a[i]=a[i]*b[i];fft(a,-1);
for(int i=n+1;i<=n*2;i++) ans=max(ans,(LL)(a[i].x/limit+0.5));
ans<<=1;ans=-ans;
for(int i=-m;i<=m;i++) Sum=min(Sum,(LL)(A-B)*2*i+(LL)n*i*i);
ans+=Sum+sqA+sqB;cout<<ans<<endl;
return 0;
}
LUOGU P3723 [AH2017/HNOI2017]礼物 (fft)的更多相关文章
- [Luogu P3723] [AH2017/HNOI2017]礼物 (FFT 卷积)
题面 传送门:洛咕 Solution 调得我头大,我好菜啊 好吧,我们来颓柿子吧: 我们可以只旋转其中一个手环.对于亮度的问题,因为可以在两个串上增加亮度,我们也可以看做是可以为负数的. 所以说,我们 ...
- 洛谷 P3723 [AH2017/HNOI2017]礼物 解题报告
P3723 [AH2017/HNOI2017]礼物 题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个 ...
- P3723 [AH2017/HNOI2017]礼物
题目链接:[AH2017/HNOI2017]礼物 题意: 两个环x, y 长度都为n k可取 0 ~ n - 1 c可取任意值 求 ∑ ( x[i] - y[(i + k) % n + 1] ...
- 洛谷P3723 [AH2017/HNOI2017]礼物(FFT)
传送门 首先,两个数同时增加自然数值相当于只有其中一个数增加(此增加量可以小于0) 我们令$x$为当前的增加量,${a},{b}$分别为旋转后的两个数列,那么$$ans=\sum_{i=1}^n(a_ ...
- [AH2017/HNOI2017]礼物(FFT)
题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在她生日的前一 ...
- Luogu 3723 [AH2017/HNOI2017]礼物
BZOJ 4827 $$\sum_{i = 1}^{n}(x_i - y_i + c)^2 = \sum_{i = 1}^{n}(x_i^2 + y_i^2 + c^2 - 2 * x_iy_i + ...
- 洛谷P3723 [AH2017/HNOI2017]礼物
吴迪说他化学会考上十分钟就想出来了,太神了%%%不过我也十分钟 但是调了一个多小时啊大草 懒得人话翻译了,自己康吧: 我的室友(真的是室友吗?)最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决 ...
- 笔记-[AH2017/HNOI2017]礼物
笔记-[AH2017/HNOI2017]礼物 [AH2017/HNOI2017]礼物 \[\begin{split} ans_i=&\sum_{j=1}^n(a_j-b_j+i)^2\\ =& ...
- bzoj 4827: [Hnoi2017]礼物 [fft]
4827: [Hnoi2017]礼物 题意:略 以前做的了 化一化式子就是一个卷积和一些常数项 我记着确定调整值还要求一下导... #include <iostream> #include ...
随机推荐
- rest framework之限流组件
一.自定义限流 限流组件又叫做频率组件,用于控制客户端可以对API进行的请求频率,比如说1分钟访问3次,如果在1分钟内超过3次就对客户端进行限制. 1.自定义限流 假设现在对一个API访问,在30s内 ...
- nodejs模块——fs模块 使用fs.read读文件
使用fs.read读文件 fs.read() 先介绍fs.open. fs.open(path,flags,[mode],callback)方法用于打开文件,以便fs.read()读取. 参数说明: ...
- go构造函数
go构造函数 结构体没有构造函数,你可以创建一个函数返回一个相应类型的实例代替(类似一个工厂): func NewSaiyan(name string, power int) *Saiyan { re ...
- sql 链接查询
连接查询是另一种类型的多表查询.连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上. 例如,我们想要选出students表的所 ...
- $\mathcal{CSP-S}$,私は来ています
记事本 开个坑.背包dp我是真的一点也不会了... NOIP2014飞扬的小鸟 NOIP2018货币系统 11-4:$Countdown$ $to$ $the$ $tenth$ $day$ 上午 困的 ...
- 用javascript插入<style>样式
function addCSS(cssText){ var style = document.createElement('style'), //创建一个style元素 head = document ...
- Extjs各版本的下载链接,包含ext3.4源码示例
最近在维护一个老平台,用的是ext3.4,老东西在网上找示例发现既然还有人收钱,谷歌了一下总算找到了一位免费的发布的,感谢 yipanbo 分享 Extjs的版本繁多,本文收集了Extjs各个版本的下 ...
- php 空格,换行,跳格使用说明
首先说说\n,\r,\t \n 软回车: 在Windows 中表示换行且回到下一行的最开始位置 在Linux.unix 中只表示换行,但不会回到下一行的开始位置. \r 软空格: 在Linux.uni ...
- 前端(六)—— 伪类选择器:a标签的伪类、内容伪类、索引伪类、取反伪类
a标签的伪类.内容伪类.索引伪类.取反伪类 一.a标签的四大伪类 :link:未访问状态 :hover:悬浮状态 :active:活跃状态 :visited:已访问状态 四大伪类也可用于其他标签 &l ...
- NIO 源码分析(02-2) BIO 源码分析 Socket
目录 一.BIO 最简使用姿势 二.connect 方法 2.1 Socket.connect 方法 2.2 AbstractPlainSocketImpl.connect 方法 2.3 DualSt ...