「AHOI / HNOI2017」礼物
「AHOI / HNOI2017」礼物
题目描述
我的室友最近喜欢上了一个可爱的小女生。马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她。每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度。
但是在她生日的前一天,我的室友突然发现他好像拿错了一个手环,而且已经没时间去更换它了!他只能使用一种特殊的方法,将其中一个手环中所有装饰物的亮度增加一个相同的自然数 c(即非负整数)。并且由于这个手环是一个圆,可以以任意的角度旋转它,但是由于上面装饰物的方向是固定的,所以手环不能翻转。需要在经过亮度改造和旋转之后,使得两个手环的差异值最小。
在将两个手环旋转且装饰物对齐了之后,从对齐的某个位置开始逆时针方向对装饰物编号1,2,…,n,其中 n 为每个手环的装饰物个数, 第 1 个手环的 i 号位置装饰物亮度为 xi,第 2 个手环的 i 号位置装饰物亮度为 yi,两个手环之间的差异值为(参见输入输出样例和样例解释):
$\sum_{i=1}^{n} (x_i-y_i)^2$
麻烦你帮他计算一下,进行调整(亮度改造和旋转),使得两个手环之间的差异值最小,这个最小值是多少呢?
输入输出格式
输入格式:
输入数据的第一行有两个数n, m,代表每条手环的装饰物的数量为n,每个装饰物的初始亮度小于等于m。
接下来两行,每行各有n个数,分别代表第一条手环和第二条手环上从某个位置开始逆时针方向上各装饰物的亮度。
输出格式:
输出一个数,表示两个手环能产生的最小差异值。注意在将手环改造之后,装饰物的亮度
可以大于 m。
输入输出样例
说明
【样例解释】
需要将第一个手环的亮度增加1,第一个手环的亮度变为: 2 3 4 5 6
旋转一下第二个手环。对于该样例,是将第二个手环的亮度6 3 3 4 5向左循环移动一个位置,使得第二手环的最终的亮度为: 3 3 4 5 6。
此时两个手环的亮度差异值为1
【数据范围】
30%的数据满足n≤500, m≤10;
70%的数据满足n≤5000;
100%的数据满足1≤n≤50000, 1≤m≤100, 1≤ai≤m。
Soda的题解
首先,有一个结论:两个手环增加非负整数亮度,等于其中一个增加一个整数亮度(可以为负)。也就是相对性。
我们令增加量为\(x\),旋转以后的原数列为\({a}{b}\)那么现在的费用就是:
\]
我们把第\(i\)项拿出来拆开,得到:
\]
那么原式变成了
\]
我们发现,这个式子除了最后一项之外都是确定的。那么我们只要令最后一项最大,那么就可以得到最小的费用值了
现在问题转化为求\(\sum_{i=1}^na_ib_i\)的最大值
等等,这个形式......
我们把数列{a}反过来,变成
\]
这是一个卷积吗
所以把反过来的数列\({a}\)倍长,和数列\({b}\)卷积,得到的项里面的第\(n+1\)到\(n*2\)项的最大值,就是\(\sum_{i=1}^na_ib_i\)的最大值
然后把前面的不变项加上,枚举变化量,就是答案了
时间复杂度\(O(n\log n+nm)\)
struct node {double x,y;};
il node operator+(co node&a,co node&b){
return (node){a.x+b.x,a.y+b.y};
}
il node operator-(co node&a,co node&b){
return (node){a.x-b.x,a.y-b.y};
}
il node operator*(co node&a,co node&b){
return (node){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};
}
il node operator/(co node&a,double k){
return (node){a.x/k,a.y/k};
}
co double PI=acos(-1);
co int N=262145; // 2^18+1
int rev[N];
void fourier_trans(node a[],int limit,int inverse){
for(int i=0;i<limit;++i)if(i<rev[i]) swap(a[i],a[rev[i]]);
for(int step=1;step<limit;step<<=1){
double alpha=inverse*PI/step;
for(int k=0;k<step;++k){
node omega=(node){cos(alpha*k),sin(alpha*k)};
for(int even=k;even<limit;even+=step<<1){
int odd=even+step;
node t=omega*a[odd];
a[odd]=a[even]-t,a[even]=a[even]+t;
}
}
}
if(inverse==-1)for(int i=0;i<limit;++i) a[i]=a[i]/limit;
}
int n,m;
node a[N],b[N];
LL s1,s2,ans=1e18;
int main(){
read(n),read(m);
for(int i=1;i<=n;++i){
read(a[i].x);
s1+=a[i].x*a[i].x,s2+=a[i].x;
}
for(int i=1;i<=n;++i){
read(b[i].x);
s1+=b[i].x*b[i].x,s2-=b[i].x;
}
copy(a+1,a+n+1,a+n+1);
reverse(b+1,b+n+1);
int len=ceil(log2(3*n+1)),limit=1<<len;
for(int i=0;i<limit;++i) rev[i]=rev[i>>1]>>1|(i&1)<<(len-1);
fourier_trans(a,limit,1),fourier_trans(b,limit,1);
for(int i=0;i<limit;++i) a[i]=a[i]*b[i];
fourier_trans(a,limit,-1);
for(int i=0;i<limit;++i) a[i].x=round(a[i].x);
for(int i=1;i<=n;++i)
for(int j=-m;j<=m;++j)
ans=min(ans,s1+j*j*n+2*j*s2-2*(LL)a[i+n].x);
printf("%lld\n",ans);
return 0;
}
体验了一下FFT用手写complex和数组的写法,久违了。
「AHOI / HNOI2017」礼物的更多相关文章
- loj#2020 「AHOI / HNOI2017」礼物 ntt
loj#2020 「AHOI / HNOI2017」礼物 链接 bzoj没\(letex\),差评 loj luogu 思路 最小化\(\sum\limits_1^n(a_i-b_i)^2\) 设改变 ...
- loj#2020. 「AHOI / HNOI2017」礼物
题意:给定xy数组求 \(\sum_{i=0}^{n-1}(x_i+y_{(i+k)\modn}+c)^2\) 题解:先化简可得 \(n*c^2+2*\sum_{i=0}^{n-1}x_i-y_i+\ ...
- 「AHOI / HNOI2017」单旋
「AHOI / HNOI2017」单旋 题目链接 H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种 ...
- 「AHOI / HNOI2017」影魔
「AHOI / HNOI2017」影魔 题目描述 解决这类比较复杂的区间贡献问题关键在于找到计算的对象. 比如这道题,我们计算的对象就是区间中间的最大值. 对于点\(i\),我们找到左边第一个比他大的 ...
- loj #2023. 「AHOI / HNOI2017」抛硬币
#2023. 「AHOI / HNOI2017」抛硬币 题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个 ...
- loj #2021. 「AHOI / HNOI2017」大佬
#2021. 「AHOI / HNOI2017」大佬 题目描述 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢 ...
- [LOJ 2022]「AHOI / HNOI2017」队长快跑
[LOJ 2022]「AHOI / HNOI2017」队长快跑 链接 链接 题解 不难看出,除了影响到起点和终点的射线以外,射线的角度没有意义,因为如果一定要从该射线的射出一侧过去,必然会撞到射线 因 ...
- LOJ#2019. 「AHOI / HNOI2017」影魔
题意: 在一个序列中 如果有一个子区间 它有一个端点是区间最大值 另一个端点不是这个区间的次大值 就会有p2的贡献 它两个端点分别是最大值次大值 就会有p1的贡献 我们发现这两个条件有一个重合的部分 ...
- 「AH2017/HNOI2017」礼物
题目链接 戳我 \(Solution\) 应为我们可以将任意一个数列加上一个非负整数,即可以变为将一个数列加上一个整数(可以为负),我们将这个整数设为\(z\).所以要求的式子的变为: \[\sum_ ...
随机推荐
- TCP/IP学习笔记4--网络地址
"他强由他强,清风拂山岗.他横由他横,明月照大江.世间诸事,敞开心扉,顺其自然." -- 张大千 地址具有两个特性: 1:唯一性 同一个通信网络中的任意两个通信主体不能具有相同的地 ...
- java8新特性六-Optional 类
Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个容器:它可以保存类型T的值,或者仅仅保 ...
- DS 壹之型 头指针与头结点
之前结合网上博客整理的笔记,希望能帮你解除疑惑!
- Android--打开指定程序(微博/微信/QQ等)
Intent intent = new Intent(); ComponentName cmp = new ComponentName("com.sina.weibo"," ...
- SAS学习笔记63 如何导出Log
如上,将Log输出,然后又恢复到SAS系统里面的Log,把需要运行的程序放到他们中间就可以了.这种方法不会出现Log打印满了的情况 这种是先输出在SAS系统里面,然后在输出,在SAS里面Log的行是有 ...
- Different Subsets For All Tuples CodeForces - 660E (组合计数)
大意: 定义$f(a)$表示序列$a$本质不同子序列个数. 给定$n,m$, 求所有长$n$元素范围$[1,m]$的序列的$f$值之和. 显然长度相同的子序列贡献是相同的. 不考虑空串, 假设长$x$ ...
- [高清] Excel函数速记手册
------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...
- 基于CentOS6.5的Dubbo及Zookeeper配置
基于CentOS的Dubbo及Zookeeper配置 需要提前准备好的资料: 1.首先配置java环境 步骤: 将jdk的包上传至centos服务器的/opt目录下,并且解压 tar -zxvf jd ...
- redis数据结构和常用命令
redis常用数据结构 String 最简单的K_V,value可以是数字或者字符串,使用场景:微博数.普通计数,命令:get set incr(加1) decr(减1) mget(获取多个值),se ...
- WPF 的 Application.Current.Dispatcher 中,Dispatcher 属性一定不会为 null
原文:WPF 的 Application.Current.Dispatcher 中,Dispatcher 属性一定不会为 null 在 WPF 程序中,可能会存在 Application.Curren ...