P3723 [AH2017/HNOI2017]礼物
题目链接:[AH2017/HNOI2017]礼物
题意:
两个环x, y 长度都为n
k可取 0 ~ n - 1 c可取任意值
求 ∑ ( x[i] - y[(i + k) % n + 1] + c) ^ 2 的最小值
ans[k] = ∑ ( x[i], y[(i + k) % n + 1] ) ^ 2
拆项
发现ans[k] = ∑ x[i] ^ 2 + ∑ y[i] ^ 2 + n * c ^ 2 + 2 * ∑ x[i] * c - 2 * ∑ y[i] * c - 2 * ∑ x[i] * y[(i + k) % n + 1]
然后 就没有然后了
暴力一项一项解 处理出所有的ans 找最小值就行了
∑ x[i] ^ 2 + ∑ y[i] ^ 2
固定的直接算就行
n * c ^ 2 + 2 * ∑ x[i] * c- 2 * ∑ y[i] * c
把这个式子看作是关于c的
动用初中数学二次函数知识算出最小值
- 2 * ∑ x[i] * y[(i + k) % n + 1]
那么这个呢? FFT大法好
这就很板子
然后是代码
// luogu-judger-enable-o2
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <complex>
using namespace std;
const int N = 3e5 + ;
const double pi = acos(-);
typedef complex<double> cd;
cd a[N], b[N];
double f[N];
int n, m, lim, l, r[N];
int x[N], y[N], sx, sy;
long long ans; inline void init(){
scanf("%d%d", &n, &m);
for(int i = ; i < n; i++){
scanf("%d", &x[i]);
a[i] = x[i], ans += x[i] * x[i], sx += x[i];
}
for(int i = ; i < n; i++){
scanf("%d", &y[i]);
b[i] = y[i], ans += y[i] * y[i], sy += y[i];
} reverse(a, a + n); //翻转a
for(int i = ; i < n; i++) b[i + n] = b[i];
for(lim = ; lim < * n; lim <<= ) l++;//注意是3 * n哦
} inline void cal(){
for(int i = ; i < lim; i++)
r[i] = (r[i >> ] >> ) | ((i & ) << (l - ));
} void fft(cd * c, int type){
for(int i = ; i < lim; i++)
if(i < r[i]) swap(c[i], c[r[i]]);
for(int i = ; i < lim; i <<= ){
cd xx(cos(pi / i), type * sin(pi / i));
for(int j = ; j < lim; j += (i << )){
cd yy(, );
for(int k = ; k < i; k++, yy *= xx){
cd p = c[j + k], q = yy * c[i + j + k];
c[j + k] = p + q;
c[i + j + k] = p - q;
}
}
}
} int main(){
init();
cal();
int as1 = floor(1.0 * (sy - sx) / n), as2 = ceil(1.0 * (sy - sx) / n);
ans += min(n * as1 * as1 + * (sx - sy) * as1, n * as2 * as2 + * (sx - sy) * as2);
fft(a, ); fft(b, );
for(int i = ; i < lim; i++) a[i] *= b[i];
fft(a, -);
for(int i = n - ; i < (n << ) - ; i++)//统计答案 f[n - 1 + i] = ans[i];
f[i] = round(a[i].real() / lim);
ans -= *max_element(f + n - , f + (n << ) - ) * ;
printf("%lld", ans);
return ;
}
P3723 [AH2017/HNOI2017]礼物的更多相关文章
- 洛谷 P3723 [AH2017/HNOI2017]礼物 解题报告
P3723 [AH2017/HNOI2017]礼物 题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个 ...
- [Luogu P3723] [AH2017/HNOI2017]礼物 (FFT 卷积)
题面 传送门:洛咕 Solution 调得我头大,我好菜啊 好吧,我们来颓柿子吧: 我们可以只旋转其中一个手环.对于亮度的问题,因为可以在两个串上增加亮度,我们也可以看做是可以为负数的. 所以说,我们 ...
- 洛谷P3723 [AH2017/HNOI2017]礼物(FFT)
传送门 首先,两个数同时增加自然数值相当于只有其中一个数增加(此增加量可以小于0) 我们令$x$为当前的增加量,${a},{b}$分别为旋转后的两个数列,那么$$ans=\sum_{i=1}^n(a_ ...
- 洛谷P3723 [AH2017/HNOI2017]礼物
吴迪说他化学会考上十分钟就想出来了,太神了%%%不过我也十分钟 但是调了一个多小时啊大草 懒得人话翻译了,自己康吧: 我的室友(真的是室友吗?)最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决 ...
- LUOGU P3723 [AH2017/HNOI2017]礼物 (fft)
传送门 解题思路 首先我们设变化量为\(r\),那么最终的答案就可以写成 : \[ ans=min(\sum\limits_{i=1}^n(a_i-b_i+r)^2) \] \[ ans=min(\s ...
- 笔记-[AH2017/HNOI2017]礼物
笔记-[AH2017/HNOI2017]礼物 [AH2017/HNOI2017]礼物 \[\begin{split} ans_i=&\sum_{j=1}^n(a_j-b_j+i)^2\\ =& ...
- P3723 【[AH2017/HNOI2017]礼物】
被某大佬指出这是多项式板子!? 我们假设我们原始数列是\(a_i, c_i\), 旋转后的数列是\(a_i, b_i\),我们的增加量为x \[\sum_{i = 1}^n(a_i - b_i + x ...
- BZOJ4827:[AH2017/HNOI2017]礼物——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4827 https://www.luogu.org/problemnew/show/P3723 题面 ...
- [AH2017/HNOI2017] 礼物 解题报告 (FFT)
题目链接: https://www.luogu.org/problemnew/show/P3723 题目: 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自 ...
随机推荐
- Python IO模型
这篇博客是本人借鉴一些大神的博客并结合自己的学习过程写下的. 事件驱动模型 事件驱动模型是一种编程范式,这里程序的执行流由外部事件来决定.它的特点是包含一个事件循环,当外部事件发生时,不断从队列里取出 ...
- 未能加载文件或程序集"Newtonsoft.Json, Version=4.5.0.0
这问题遇到好几次了,重新更改了引用都不好使,有的时候版本改成一致就好了,但是有的地方你不知道在哪里用了就不好排查,所性在config里面加个配置让程序运行的时候去处理得了~ 很实用,放在configu ...
- CentOS 6.5 手动rpm包安装gcc、g++
摘自:https://blog.csdn.net/lichen_net/article/details/70211204 mount CentOS的安装光盘,然后先后安装 rpm -ivh ppl-0 ...
- java总结:double取两位小数的多种方法
1.方法一 四舍五入: import java.math.BigDecimal; double f = 111231.5585; BigDecimal b = new BigDecimal(f); d ...
- PyCharm3.0默认快捷键
PyCharm3.0默认快捷键(翻译的) 1.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性) Ctrl + Alt + Space 快速导入任意类 Ctrl + S ...
- 树遍历(广度优先 vs 深度优先)
const data = [ { id: '01', text: '湖北省', children: [ { id: '01001', text: '武汉市', children: [ { id: '0 ...
- [官网]Red Hat Enterprise Linux Release Dates
Red Hat Enterprise Linux Release Dates https://access.redhat.com/articles/3078 The tables below list ...
- Oracle可视化工具PL/SQL Developer的安装与配置
安装程序: 安装目录不能有中文和空格,否则无法进行远程连接. 推荐使用 D:\PLSQLDeveloper 为安装目录 破解PLSQLDeveloper 使用工具 PLSQL Developer10. ...
- day 7-3 僵尸进程,孤儿进程与守护进程
一.基本定义 正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 当一个 进程完成它的工作终止之后,它 ...
- 2.请介绍一下List和ArrayList的区别,ArrayList和HashSet区别
第一问: List是接口,ArrayList实现了List接口. 第二问: ArrayList实现了List接口,HashSet实现了Set接口,List和Set都是继承Collection接口. A ...