「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_ ...
随机推荐
- mysql 按照两个字段之和进行排序
SELECT *,zan_num+fake_zan_num show_zan FROM `tf_news` order by show_zan desc TP实现 $news = M('news'); ...
- Java开发笔记(一百零七)URL地址的组成格式
URL的全称是Uniform Resource Locator,意思是统一资源定位符,俗称网络地址或网址.网络上的每个文件及接口,都有对应的URL网址,它规定了其他设备如何通过一系列的路径找到自己,犹 ...
- python学习-61 类
类 (在python2里) 1.属性 ---数据属性 ---函数属性 查看属性字典 class chinese: rz:'huangzhong' print(chinese.__dict__) 运行结 ...
- PAT(B) 1090 危险品装箱(Java)
题目链接:1090 危险品装箱 (25 point(s)) 题目描述 集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里.比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸. 本题 ...
- [LOJ2065] [SDOI2016]模式字符串
题目链接 洛谷:https://www.luogu.org/problemnew/show/P4075 LOJ:https://loj.ac/problem/2065 Solution 这种题看起来就 ...
- Zookeeper学习笔记(三)——java客户端代码操作
Zookeeper客户端java代码操作 上篇博客记录了shell命令操作zookeeper集群的方式,这次尝试采用java代码来操作.通过查阅API,发现并不困难. 1. 首先获得客户端与服务器的连 ...
- Bean进行操作的相关工具方法
Bean进行操作的相关工具方法 /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p ...
- Java 处理异常
Java中 ,catch块和 finally块中都有可能发生异常,这时候就需要 用throw 抛出异常 类似于 C#里方法体中的 throw:
- Cookie中的HttpOnly
1.什么是HttpOnly? 如果您在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,具体一点的介绍请google进行搜索 2.ja ...
- mysql开启二进制日志
打开xhell进入系统 进入mysql配置文件目录 执行 cd /etc/mysql 首先找到my.cnf这个配置文件,然后使用vim进入文件编辑 放开我标记的地方. 注意我标记的地方,其实这个就是在 ...