4827: [Hnoi2017]礼物
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]礼物的更多相关文章
- bzoj 4827: [Hnoi2017]礼物 [fft]
4827: [Hnoi2017]礼物 题意:略 以前做的了 化一化式子就是一个卷积和一些常数项 我记着确定调整值还要求一下导... #include <iostream> #include ...
- bzoj 4827 [Hnoi2017]礼物——FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4827 式子就是 \sum_{i=0}^{n-1}(a[ i ] - b[ i+k ] + c ...
- bzoj 4827 [Hnoi2017] 礼物 —— FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4827 首先,旋转对应,可以把 b 序列扩展成2倍,则 a 序列对应到的还是一段区间: 再把 ...
- bzoj 4827: [HNOI2017]礼物 (FFT)
一道FFT 然而据说暴力可以水70分 然而我省选的时候看到了直接吓傻了 连暴力都没打 太弱了啊QAQ emmmm 详细的拆开就看其他题解吧233 最后那一步卷积其实我一直没明白 后来画画图终于懂了 ...
- BZOJ:4827: [Hnoi2017]礼物
[问题描述] 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度. 但是在她生日的 ...
- 【刷题】BZOJ 4827 [Hnoi2017]礼物
Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在 ...
- BZOJ 4827 [Hnoi2017]礼物 ——FFT
题目上要求一个循环卷积的最小值,直接破环成链然后FFT就可以了. 然后考虑计算的式子,可以分成两个部分分开计算. 前半部分FFT,后半部分扫一遍. #include <map> #incl ...
- bzoj 4827: [Hnoi2017]礼物【FFT】
记得FFT要开大数组!!开到快MLE的那种!!我这个就是例子TAT,5e5都RE了 在这题上花的时间太多了,还是FFT不太熟练. 首先看70分的n方做法:从0下标开始存,先n--,把a数组倍增,然后枚 ...
- BZOJ 4827: [Hnoi2017]礼物 FFT_多项式_卷积
题解稍后在笔记本中更新 Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r&q ...
随机推荐
- 解决 There are no resources that can be added or removed from the server
网上下载了一个项目,在eclipse中部署时,加载项目到tomcat中项目名称无法显示,报出There are no resources that can be added or removed fr ...
- NodeJS做中转服务器,转发接口
搬家后的博客地址:http://www.cnblogs.com/shihaibin821/p/7683752.html
- Oracle 补丁那些事儿(PS、PSU、CPU、SPU、BP、DBBP…)
当前ORACLE数据库提供两种方式的补丁一种是主动的Proactive Patches和另一种被动的Reactive Patches,其中Reactive Patches是指过去的ONE-OFF Pa ...
- Django的model中创建表
类中的class Meta字段的作用: 第一个作用可以给这个类起名字 在后台的admin中显示这个类名字 class CourseCategory(models.Model): "" ...
- 解决NSTextContainer分页时文本截断问题
解决NSTextContainer分页时文本截断问题 NSTextContainer与NSLayoutManager配合使用可以将大文本文件分页,但是,分页过程中会遇到问题,显示字符被截断的问题:) ...
- 铁乐学python26_hashlib+configparser+logging模块
大部份内容摘自博客http://www.cnblogs.com/Eva-J/ hashlib模块算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢? ...
- Ubuntu 14.04 修改时区
执行下面命令,并按照提示选择"Asia/Shanghai": sudo dpkg-reconfigure tzdata 正常执行结果为: Current default time ...
- October 2nd 2017 Week 40th Monday
Grown-ups work for things. Grown-ups pay. Grown-ups suffer consequences. 真正的成年人会奋斗.会付出.会承担后果. How to ...
- 题解 P1018 【乘积最大】
题目链接:P1018 乘积最大 题面 今年是国际数学联盟确定的"2000――世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面 ...
- Programming Assignment 2: Deques and Randomized Queues
编程作业二 作业链接:Deques and Randomized Queues & Checklist 我的代码:Deque.java & RandomizedQueue.java & ...