强省HN弱省HA……(读作强省湖南弱省蛤

原题:

我的室友最近喜欢上了一个可爱的小女生。马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一
个送给她。每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度。但是在她生日的前一天,我的室友突
然发现他好像拿错了一个手环,而且已经没时间去更换它了!他只能使用一种特殊的方法,将其中一个手环中所有
装饰物的亮度增加一个相同的自然数 c(即非负整数)。并且由于这个手环是一个圆,可以以任意的角度旋转它,
但是由于上面 装饰物的方向是固定的,所以手环不能翻转。需要在经过亮度改造和旋转之后,使得两个手环的差
异值最小。在将两个手环旋转且装饰物对齐了之后,从对齐的某个位置开始逆时针方向对装饰物编号 1,2,…,n,
其中 n 为每个手环的装饰物个数,第 1 个手环的 i 号位置装饰物亮度为 xi,第 2 个手 环的 i 号位置装饰物
亮度为 yi,两个手环之间的差异值为(参见输入输出样例和样例解释): \sum_{i=1}^{n}(x_i-y_i)^2麻烦你帮他
计算一下,进行调整(亮度改造和旋转),使得两个手环之间的差异值最小, 这个最小值是多少呢?
1≤n≤50000, 1≤m≤100, 1≤ai≤m
 
FFT嘛,直接推公式

然后可以发现两边的项都可以o(n)预处理使得在枚举c后可以O(1)计算,中间的是个循环卷积

枚举c和k后FFT即可

代码(还没写

现在写了:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
const ll inf=(ll)(<<);
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
int wtp=,wtc[];
void wt(int x,char y){
if(!x){ putchar(''); return ;}
if(x<) putchar('-'),x=-x;
while(x) wtc[++wtp]=x%+'',x/=;
while(wtp) putchar(wtc[wtp--]);
putchar(y);
}
struct cp{
double r,i;
cp(double _r=,double _i=): r(_r),i(_i){}
cp operator+(cp x){return cp(r+x.r,i+x.i);}
cp operator-(cp x){return cp(r-x.r,i-x.i);}
cp operator*(cp x){return cp(r*x.r-i*x.i,r*x.i+i*x.r);}
};
int n,m; ll S=,s=;
cp a[],b[],tmp[],_x,_y,c[];
int rvs[],dg[],N,L;
void fft(cp x[],int mk){
for(int i=;i<N;++i) tmp[i]=x[rvs[i]];
for(int i=;i<N;++i) x[i]=tmp[i];
for(int i=;i<=N;i<<=){
cp wn(cos(*M_PI/i),mk*sin(*M_PI/i));
for(int k=;k<N;k+=i){
cp w(,);
for(int j=k;j<k+(i>>);++j){
_x=x[j],_y=x[j+(i>>)]*w;
x[j]=_x+_y,x[j+(i>>)]=_x-_y;
w=w*wn;
}
}
}
if(mk==-) for(int i=;i<N;++i) x[i].r/=N;
}
int main(){//freopen("ddd.in","r",stdin);
cin>>n>>m;
int x;
for(int i=;i<n;++i){
x=rd();
a[n--i]=cp(x);
S+=x*x,s+=x;
}
for(int i=;i<n;++i){
x=rd();
b[i]=b[i+n]=cp(x);
S+=x*x,s-=x;
}
s<<=;
for(N=,L=;N<=(n<<);N<<=,++L); N<<=,++L;
for(int i=;i<N;++i){
for(int j=i,k=;j;j>>=,++k) dg[k]=j&;
for(int j=;j<L;++j) rvs[i]=(rvs[i]<<)|dg[j];
}
/*for(int i=0;i<N;++i) cout<<(int)(a[i].r+0.5)<<" ";
cout<<endl;
for(int i=0;i<N;++i) cout<<(int)(b[i].r+0.5)<<" ";
cout<<endl;*/
fft(a,),fft(b,);
for(int i=;i<N;++i) c[i]=a[i]*b[i];
fft(c,-);
ll ans=inf;
for(int i=;i<n;++i)for(int j=;j<=m;++j){
ans=min(ans,S+j*s+n*j*j-*(ll)(c[n-+i].r+0.5));
ans=min(ans,S-j*s+n*j*j-*(ll)(c[n-+i].r+0.5));
}
//for(int i=0;i<N;++i) cout<<(int)(c[i].r+0.5)<<" ";
cout<<ans<<endl;
return ;
}

【BZOJ4827】【HNOI2017】礼物的更多相关文章

  1. [bzoj4827][Hnoi2017]礼物_FFT

    礼物 bzoj-4827 Hnoi-2017 题目大意:给定两个长度为$n$的手环,第一个手环上的$n$个权值为$x_i$,第二个为$y_i$.现在我可以同时将所有的$x_i$同时加上自然数$c$.我 ...

  2. [BZOJ4827][Hnoi2017]礼物(FFT)

    4827: [Hnoi2017]礼物 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1315  Solved: 915[Submit][Status] ...

  3. BZOJ4827 [Hnoi2017]礼物 多项式 FFT

    原文链接http://www.cnblogs.com/zhouzhendong/p/8823962.html 题目传送门 - BZOJ4827 题意 有两个长为$n$的序列$x$和$y$,序列$x,y ...

  4. bzoj4827 [Hnoi2017]礼物

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

  5. bzoj千题计划303:bzoj4827: [Hnoi2017]礼物

    https://www.lydsy.com/JudgeOnline/problem.php?id=4827 式子化简一下,发现最后只跟 Σ xi*yi 有关 第二个序列反转,就可以用FFT优化 注意: ...

  6. 2018.11.16 bzoj4827: [Hnoi2017]礼物(ntt)

    传送门 nttnttntt 入门题. 考虑展开要求的式子∑i=0n−1(xi−yi−c)2\sum_{i=0}^{n-1}(x_i-y_i-c)^2∑i=0n−1​(xi​−yi​−c)2 => ...

  7. BZOJ4827: [Hnoi2017]礼物(FFT 二次函数)

    题意 题目链接 Sol 越来越菜了..裸的FFT写了1h.. 思路比较简单,直接把 \(\sum (x_i - y_i + c)^2\) 拆开 发现能提出一坨东西,然后与c有关的部分是关于C的二次函数 ...

  8. BZOJ4827:[HNOI2017]礼物(FFT)

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

  9. 【BZOJ4827】 [Hnoi2017]礼物

    BZOJ4827 [Hnoi2017]礼物 Solution 如果一串数的增加,不就等于另一串数减吗? 那么我们可以把答案写成另一个形式: \(ans=\sum_{i=1}^n(x_i-y_i+C)^ ...

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

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

随机推荐

  1. JavaScript中的Date对象在IOS中的“大坑”

    在IOS5以上版本(不包含IOS5)中的Safari浏览器能正确解释出Javascript中的 new Date('2013-10-21') 的日期对象. 但是在IOS5版本里面的Safari解释ne ...

  2. python 协程库gevent学习--gevent源码学习(二)

    在进行gevent源码学习一分析之后,我还对两个比较核心的问题抱有疑问: 1. gevent.Greenlet.join()以及他的list版本joinall()的原理和使用. 2. 关于在使用mon ...

  3. 《使用swoole》

    第一 在windows系统搭建swoole环境: 首先,安装cygwin:步骤截图如下 其次,使用cygwin安装swoole: 打开cygwin的终端,进入~目录,并将swoole-src上传到~目 ...

  4. html css類和css()

    addClass():一個或者多個元素添加一個或者多個類 $("元素一,元素2,元素3").addClass(“類名1  類名2”) removeClass():一個或者多個元素刪 ...

  5. html 塊 div span

    塊級元素:元素結束后,另起一行:如p,table,h1,ul,ol 內聯元素:元素結束后,不會另起一行:如a,td.image.b <div>是塊級元素,div本身沒有含義,div是htm ...

  6. LOJ6045 雅礼集训 2017 Day8 价(最小割)

    由Hall定理,任意k种减肥药对应的药材数量>=k.考虑如何限制其恰好为k,可以将其看作是使对应的药材数量尽量少. 考虑最小割.建一个二分图,左边的点表示减肥药,右边的点表示药材.减肥药和其使用 ...

  7. HDU-1686-KMP-水题

    纯KMP #include <cstdio> #include <algorithm> #include <cstring> #include <ctype. ...

  8. java构造函数总结

    构造函数总结 概念:    创建对象时由JVM自动调用的函数 作用:    在创建对象的时候给对象的成员变量赋值: 写法: 修饰符:可以用访问权限修饰符(public.private等)修饰:不能用s ...

  9. Leetcode 326.3的幂 By Python

    给定一个整数,写一个函数来判断它是否是 3 的幂次方. 示例 1: 输入: 27 输出: true 示例 2: 输入: 0 输出: false 示例 3: 输入: 9 输出: true 示例 4: 输 ...

  10. 洛谷 P1407 [国家集训队]稳定婚姻 解题报告

    P1407 [国家集训队]稳定婚姻 题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的 ...