4827: [Hnoi2017]礼物

链接

分析:

  求最小的$\sum_{i=1}^{n}(x_i-y_i)^2$

  设旋转了j位,每一位加上了c。

  $\sum\limits_{i=1}^{n}(x_{i+j}+c-y_i)^2$

  $=\sum\limits_{i=1}^{n}x_{i+j}^2+y_i^2+c^2+2x_{i+j}c-2y_ic-2x_{i+j}y_i$

  $=\sum x_i^2+\sum y_i^2+nc^2+2c \sum (x_i-y_i)-2\sum x_{i+j}y_i$

  发现只有最后一项是要求的。

  $\sum x_{i+j}y_i$ 然后把y翻转一下,就是$\sum x_{i+j}y_{n - i +1}$,再把x加倍即可。

  考虑为什么这样就解决了,如果不旋转,那么$a[1],a[2],a[3]$与$b[1],b[2],b[3]$相乘,那么得到的$c[4]=a[1] \times b[3]+a[2]\times b[2]+a[3]\times b[1]$,所以如果翻转b,c[4]就是旋转0位的答案。在a后面加倍一次,得到那么f[5]就是旋转1位的答案,同理f[6]是旋转2位的答案。

  而且c是可以直接求出的,可以不用枚举,戳这

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = , INF = 1e9;
const double Pi = acos(-1.0), eps = 1e-;
int rev[N], f[N], x[N], y[N];
struct Com{
double x, y;
Com(double _x = 0.0,double _y = ) { x = _x, y = _y; }
}a[N], b[N];
Com operator + (const Com &A,const Com &B) { return Com(A.x + B.x, A.y + B.y); }
Com operator - (const Com &A,const Com &B) { return Com(A.x - B.x, A.y - B.y); }
Com operator * (const Com &A,const Com &B) { return Com(A.x * B.x - A.y * B.y, A.x * B.y + A.y * B.x); } void FFT(Com *a,int n,int ty) {
for (int i = ; i < n; ++i) if (i < rev[i]) swap(a[i], a[rev[i]]);
Com w1, w, t, u;
for (int m = ; m <= n; m <<= ) {
w1 = Com(cos( * Pi / m), ty * sin( * Pi / m));
for (int i = ; i < n; i += m) {
w = Com(, );
for (int k = ; k < (m >> ); ++k) {
t = w * a[i + k + (m >> )];
u = a[i + k];
a[i + k] = u + t;
a[i + k + (m >> )] = u - t;
w = w * w1;
}
}
}
}
void mul(Com *a,Com *b,int len) {
FFT(a, len, );
FFT(b, len, );
for (int i = ; i <= len; ++i) a[i] = a[i] * b[i];
FFT(a, len, -);
for (int i = ; i <= len; ++i) f[i] = (int)(a[i].x / (double)len + 0.5);
}
int main() {
int n = read(), m = read(), len = , lg = , Sx = , Sy = , S = ;
while (len <= n + n) len <<= , lg ++;
for (int i = ; i <= len; ++i)
rev[i] = (rev[i >> ] >> ) | ((i & ) << (lg - ));
for (int i = ; i < n; ++i)
x[i] = read(), Sx += (x[i] * x[i]), S += * x[i];
for (int i = ; i < n; ++i)
y[i] = read(), Sy += (y[i] * y[i]), S -= * y[i];
for (int i = ; i < n + n; ++i) a[i] = Com(x[i % n], );
for (int i = ; i < n; ++i) b[i] = Com(y[n - i - ], );
mul(a, b, len);
int ans = INF;
for (int c = -m; c <= m; ++c)
for (int i = n; i < n + n; ++i)
ans = min(ans, Sx + Sy + c * S + n * c * c - * f[i]);
cout << ans;
return ;
}

4827: [Hnoi2017]礼物的更多相关文章

  1. bzoj 4827: [Hnoi2017]礼物 [fft]

    4827: [Hnoi2017]礼物 题意:略 以前做的了 化一化式子就是一个卷积和一些常数项 我记着确定调整值还要求一下导... #include <iostream> #include ...

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

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

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4827 首先,旋转对应,可以把 b 序列扩展成2倍,则 a 序列对应到的还是一段区间: 再把 ...

  4. bzoj 4827: [HNOI2017]礼物 (FFT)

    一道FFT 然而据说暴力可以水70分 然而我省选的时候看到了直接吓傻了  连暴力都没打 太弱了啊QAQ emmmm 详细的拆开就看其他题解吧233 最后那一步卷积其实我一直没明白 后来画画图终于懂了 ...

  5. BZOJ:4827: [Hnoi2017]礼物

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

  6. 【刷题】BZOJ 4827 [Hnoi2017]礼物

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

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

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

  8. bzoj 4827: [Hnoi2017]礼物【FFT】

    记得FFT要开大数组!!开到快MLE的那种!!我这个就是例子TAT,5e5都RE了 在这题上花的时间太多了,还是FFT不太熟练. 首先看70分的n方做法:从0下标开始存,先n--,把a数组倍增,然后枚 ...

  9. BZOJ 4827: [Hnoi2017]礼物 FFT_多项式_卷积

    题解稍后在笔记本中更新 Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r&q ...

随机推荐

  1. thinkphp导出csv文件,用表格输出excel

    1.thinkphp导出csv文件 导出csv文件可能就那几行代码,今天有个问题困扰我好久,就是导出之后出现一些html代码,这个不应该,view里面是空的,controller中最后也没有$this ...

  2. fun()可拆分赋值 fun()可以拆, 变成 fun 和 括号, fun 可以赋值

    2. 函数名可以赋值给其他变量   --->   就是 func()可以拆 def fun (): print("哈哈") a = fun # 拆分 fun()的    fu ...

  3. UI(二)之正式过程

    2018-12-04 09:48:25 1.SetWindowsHookEx ·钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统.每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获 ...

  4. 面向对象程序设计_tesk1_寒假伊始

    大一下学期的自我目标(要求包含对大一上学期的总结.对面向对象课程完成后学习到的能力的预期,对面向对象课程的期望.对编程和专业能力的愿景规划) 在大学的第一个学期,相信很多人都是在得过且过度过,我也不例 ...

  5. 用windows自带的fsutil来创建1G稀疏文件(sparse file)

    fsutils file createnew  a.dat 1073741824 fsutil sparse setflag a.dat fsutil sparse setrange a.dat 0  ...

  6. php 上传大文件主要涉及配置upload_max_filesize和post_max_size两个选项。

    今天在做上传的时候出现一个非常怪的问题,有时候表单提交可以获取到值,有时候就获取不到了,连普通的字段都获取不到了,苦思冥想还没解决,群里人问我upload_max_filesize的值改了吗,我说改了 ...

  7. js面向对象理解

    js面向对象理解 ECMAScript 有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是, ...

  8. FreeMarker标签使用

    FreeMarker标签使用 模板技术在现代的软件开发中有着重要的地位,主要用于view层的展示,freemarker是比较流行的一种. 一.FreeMarker模板文件主要有4个部分组成 ①文本,直 ...

  9. jQuery复制table header到表格的最下面

    为了让table具有更好的可读性,我们可以将表格的header信息克隆一份到表格的底部,这种特效通过JQuery就很容易实现: 1 2 3 4 5 var $tfoot = $(''); $($('t ...

  10. CURL的学习和应用

    curl安装: xp下面的安装 :修改php.ini文件的设置,找到php_curl.dll //取消下在的注释extension=php_curl.dll linux下面安装: # wget htt ...