bzoj4827: [Hnoi2017]礼物

Description

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

Input

输入数据的第一行有两个数n, m,代表每条手环的装饰物的数量为n,每个装饰物的初始 亮度小于等于m。
接下来两行,每行各有n个数,分别代表第一条手环和第二条手环上从某个位置开始逆时 针方向上各装饰物的亮度。
1≤n≤50000, 1≤m≤100, 1≤ai≤m

Output

输出一个数,表示两个手环能产生的最小差异值。
注意在将手环改造之后,装饰物的亮度 可以大于 m。

Sample Input

5 6
1 2 3 4 5
6 3 3 4 5

Sample Output

1
【样例解释】
需要将第一个手环的亮度增加1,第一个手环的亮度变为: 2 3 4 5 6 旋转一下第二个手环。对于该样例,是将第
二个手环的亮度6 3 3 4 5向左循环移动 2017-04-15 第 6 页,共 6 页 一个位置,使得第二手环的最终的亮度为
:3 3 4 5 6。 此时两个手环的亮度差异值为1。

分析

考虑一种旋转方案

ans=∑(xi−yi+c)2ans=∑(xi−yi+c)2

ans=\sum (x_i-y_i+c)^2

=∑(x2i+y2i)−2∑xiyi+nc2−2c∑xi−yi=∑(xi2+yi2)−2∑xiyi+nc2−2c∑xi−yi

=\sum (x_i^2+y_i^2) -2\sum x_iy_i+nc^2-2c\sum x_i-y_i
令 A=∑(x2i+y2i),B=∑xi−yi,A,BA=∑(xi2+yi2),B=∑xi−yi,A,BA=\sum (x_i^2+y_i^2),B=\sum x_i-y_i,A,B不受旋转影响
原式等价于 ans=A+nc2−2Bc−2∑xiyians=A+nc2−2Bc−2∑xiyians=A+nc^2-2Bc-2\sum x_iy_i
所以c的取值和旋转无关,一个二次函数最小值可以搞定。
于是问题等价于 Maximize(∑x(i+c)modnyi)Maximize(∑x(i+c)modnyi)Maximize(\sum x_{(i+c) \mod n}y_i)
其中c是旋转的参数,令 c∈[0,n−1]c∈[0,n−1]c \in [0,n-1]。
循环卷积不舒服,先倍增环,于是得到目标函数
Maximize(∑xi+cyi)Maximize(∑xi+cyi)Maximize(\sum x_{i+c}y_i)
这个东西有一个景点的处理方法,就是把 yiyiy_i翻转,得到
Maximize(∑xi+cyn−i−1)Maximize(∑xi+cyn−i−1)Maximize(\sum x_{i+c}y_{n-i-1})
于是得到了一个卷积的形式,卷积完答案区间在 [n−1,2n−1][n−1,2n−1][n-1,2n-1]中,一个FFT贴上去然后枚举即可。

代码

#include<cstdio>
#include<algorithm>
#include<cmath>
const int N = 1 << 20;
const double pi = acos(-1.0);
int ri() {char ch = getchar(); int x = 0;for(;ch < '0' || ch > '9'; ch = getchar()) ;for(;ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 1) + (x << 3) - '0' + ch;return x;
}
struct cp {double r, i;cp(double _r = 0, double _i = 0) : r(_r), i(_i) {}cp operator + (cp a) {return cp(r + a.r, i + a.i);}cp operator - (cp a) {return cp(r - a.r, i - a.i);}cp operator * (cp a) {return cp(r * a.r - i * a.i, r * a.i + i * a.r);}
}a[N], b[N], w[N];
int n, L, R[N], x[N], y[N], sum;
void Pre() {n = ri(); ri(); int sx, sy; sx = sy = 0;for(int i = 0;i < n; ++i) x[i] = ri(), sx += x[i], sum += x[i] * x[i];for(int i = 0;i < n; ++i) y[i] = ri(), sy += y[i], sum += y[i] * y[i];int c = round((double)(sy - sx) / (double)n); sum += n * c * c + ((sx - sy) * c << 1);for(int i = 0;i < n; ++i) b[i].r = y[n - i - 1];for(int i = 0;i < (n << 1); ++i) a[i].r = x[i % n];int x = 0; for(L = 1; (L <<= 1) <= (n * 3); ++x) ;for(int i = 1;i < L; ++i) R[i] = (R[i >> 1] >> 1) | ((i & 1) << x);for(int i = 0;i < L; ++i) w[i] = cp(cos(2 * pi * i / L), sin(2 * pi * i / L));
}
void FFT(cp *F) {for(int i = 0;i < L; ++i) if(i < R[i]) std::swap(F[R[i]], F[i]);for(int i = 1, d = L >> 1; i < L; i <<= 1, d >>= 1)for(int j = 0;j < L; j += (i << 1)) {cp *l = F + j, *r = F + j + i, *p = w, tp   ;for(int k = 0;k < i; ++k, ++l, ++r, p += d) tp = *r * *p, *r = *l - tp, *l = *l + tp;}
}
int main() {Pre(); FFT(a); FFT(b);for(int i = 0;i < L; ++i) a[i] = a[i] * b[i];FFT(a); int ans = 0;for(int i = 1; i < (L >> 1); ++i) std::swap(a[i], a[L - i]);for(int i = n - 1;i < (n << 1) - 1; ++i) ans = std::max(ans, int(a[i].r / L + 0.1));printf("%d\n", sum - (ans << 1));return 0;
}

bzoj4827: [Hnoi2017]礼物 FFT相关推荐

  1. bzoj4827[Hnoi2017]礼物 (FFT,生成函数)

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

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

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

  3. [bzoj4827][Hnoi2017]礼物_FFT

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

  4. P3723 [AH2017/HNOI2017]礼物 FFT + 式子化简

    传送门 文章目录 题意: 思路: 题意: 思路: 首先可以知道,我们对某个数组加上一个正数数的操作可以转换成对一个数组加上一个任意数,所以我们设变化量为xxx. 对于∑i=1n(ai−bi)2\sum ...

  5. [4827][Hnoi2017]礼物——FFT

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

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

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

  7. BZOJ 4827 [Hnoi2017]礼物 ——FFT

    题目上要求一个循环卷积的最小值,直接破环成链然后FFT就可以了. 然后考虑计算的式子,可以分成两个部分分开计算. 前半部分FFT,后半部分扫一遍. #include <map> #incl ...

  8. [AH2017/HNOI2017]礼物(FFT)

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

  9. bzoj 4827 [Hnoi2017]礼物——FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4827 式子就是 \sum_{i=0}^{n-1}(a[ i ] - b[ i+k ] + c ...

最新文章

  1. R语言data.table导入数据实战:data.table使用by函数进行数据分组(aggregate)
  2. angularjs的双向绑定原理实现
  3. paip.c++ gui 库HtmLayout 的优缺点 QT优点
  4. 保证速度与心情——pdg转pdf与djvu转pdf大法(不像网上的好多方法那样麻烦,方便快捷,纯傻瓜化操作!)
  5. Netty集成WebSocket实现客户端、服务端长连接
  6. mx350显卡天梯图_分享电脑显卡天梯图2020
  7. 计算机部分应用显示模糊,win10系统打开部分软件字体总显示模糊的解决方法
  8. 数据库报duplicate XXX entry for key primary错误的可能原因以及解决方法
  9. 而立之年,时间都去哪儿
  10. Qt之QGraphicsView入门篇
  11. 等比数列求和python_Python科学计算
  12. MySQL必须知道的点
  13. 【2021 CSP-J第二轮题解】
  14. 大数据课程作业(一)
  15. 超越Framer的基础知识
  16. element-ui table的选中行高亮和取消高亮
  17. html八卦绘制,HTML+CSS实现画出一个太极八卦图案
  18. dotnet 使用 Crossgen2 对 DLL 进行 ReadyToRun 提升启动性能
  19. 基于c51单片机的毕业设计——智能温度控制
  20. java记事本简单,java简单完整记事本

热门文章

  1. Ubuntu 20.04安装Anaconda3
  2. 接口和抽象类的区别(面试题)
  3. 【小5聊】小程序之map组件bindmarkertap标记点点击事件无反应的原因
  4. vue组件通信2 | 父子组件通信v-model
  5. 计算机操作员评分标准,计算机操作员初级操作技能考核评分记录表
  6. swoole 郭新华 - PHP代码加密技术
  7. Python爬虫——爬取某网站新闻
  8. 手工实现IE历史记录复制(转)
  9. 培养创新型思维与深度思考
  10. SQL54 平均工资