题目链接:[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]礼物的更多相关文章

  1. 洛谷 P3723 [AH2017/HNOI2017]礼物 解题报告

    P3723 [AH2017/HNOI2017]礼物 题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个 ...

  2. [Luogu P3723] [AH2017/HNOI2017]礼物 (FFT 卷积)

    题面 传送门:洛咕 Solution 调得我头大,我好菜啊 好吧,我们来颓柿子吧: 我们可以只旋转其中一个手环.对于亮度的问题,因为可以在两个串上增加亮度,我们也可以看做是可以为负数的. 所以说,我们 ...

  3. 洛谷P3723 [AH2017/HNOI2017]礼物(FFT)

    传送门 首先,两个数同时增加自然数值相当于只有其中一个数增加(此增加量可以小于0) 我们令$x$为当前的增加量,${a},{b}$分别为旋转后的两个数列,那么$$ans=\sum_{i=1}^n(a_ ...

  4. 洛谷P3723 [AH2017/HNOI2017]礼物

    吴迪说他化学会考上十分钟就想出来了,太神了%%%不过我也十分钟 但是调了一个多小时啊大草 懒得人话翻译了,自己康吧: 我的室友(真的是室友吗?)最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决 ...

  5. LUOGU P3723 [AH2017/HNOI2017]礼物 (fft)

    传送门 解题思路 首先我们设变化量为\(r\),那么最终的答案就可以写成 : \[ ans=min(\sum\limits_{i=1}^n(a_i-b_i+r)^2) \] \[ ans=min(\s ...

  6. 笔记-[AH2017/HNOI2017]礼物

    笔记-[AH2017/HNOI2017]礼物 [AH2017/HNOI2017]礼物 \[\begin{split} ans_i=&\sum_{j=1}^n(a_j-b_j+i)^2\\ =& ...

  7. P3723 【[AH2017/HNOI2017]礼物】

    被某大佬指出这是多项式板子!? 我们假设我们原始数列是\(a_i, c_i\), 旋转后的数列是\(a_i, b_i\),我们的增加量为x \[\sum_{i = 1}^n(a_i - b_i + x ...

  8. BZOJ4827:[AH2017/HNOI2017]礼物——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4827 https://www.luogu.org/problemnew/show/P3723 题面 ...

  9. [AH2017/HNOI2017] 礼物 解题报告 (FFT)

    题目链接: https://www.luogu.org/problemnew/show/P3723 题目: 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自 ...

随机推荐

  1. C#格式化字符串大全

    C#格式化字符串大全 分类: VS/C#         1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}" ...

  2. 容器化-Docker实战

    导读:本文系统性介绍Docker安装.Docker组件.Docker命令.Dockerfile语法和Docker应用,通过上述介绍使我们已经对docker基本操作有一定了解. 一.前言 本文将系统性的 ...

  3. HashSet中存放不重复元素

    一.自定义对象存放在hashSet中,保证元素不重复.重写hashCode()和equals()方法 public class Student{ private String name; privat ...

  4. C#复习笔记(3)--C#2:解决C#1的问题(结束C#2的内容:最后一些特性)

    结束C#2的内容:最后一些新性 这是本章要讲的内容: 分部类型:可以在多个源文件中为 一个类型编写代码. 特别适用于部分代码是自动生成, 而其他部分的代码为手写的类型. 静态类:对工具类进行整理, 以 ...

  5. asp.net core发布到linux

    在发布到linux的过程中出现两个问题现在总结一下: 我的虚拟机是安装到本机上面的,所以,应该在虚拟机的设置里面设置端口映射.具体设置如下: 选择vm上方的编辑 在弹出的框中选择VMnet8,点击下方 ...

  6. Java多线程系列——原子类的实现(CAS算法)

    1.什么是CAS? CAS:Compare and Swap,即比较再交换. jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronou ...

  7. crontab 从nano 转换为 vim

      crontab默认编辑器为nano,不方便使用. 修改crontab默认编辑器为vi或者其他的编辑器. export EDITOR="/usr/bin/vim" ; cront ...

  8. $mount(“#app”)手动挂载

    没有el属性时,证明vue还没绑定到特定的dom上,需要延迟加载,则使用.$mount("")进行手动挂载 https://blog.csdn.net/longzhoufeng/a ...

  9. python之读取和写入csv文件

    写入csv文件源码: #输出数据写入CSV文件 import csv data = [ ("Mike", "male", 24), ("Lee&quo ...

  10. Lodop打印设计里的 打印项对齐

    打印设计界面里,有四个对齐的图标:(1)第一个图标是左右对齐方式,该图标下有四种左右对齐方式.(2)第二个图标是上下对齐方式,该图标下有四种上下对齐方式.(3)第三个图标是等宽对齐,该图标下有三种等宽 ...