【LG3723】[AHOI2017/HNOI2017]礼物

题面

洛谷

题解

首先我们将\(c\)看作一个可以为负的整数,那么我们就可以省去讨论在哪个手环加\(c\)的繁琐步骤了

设我们当前已经选好了手环的顺序

\[Ans=\sum_{i=1}^n(x_i-y_i+c)^2\\
=\sum_{i=1}^nx_i^2+\sum_{i=1}^ny_i^2+n*c^2+2c\sum_{i=1}^n(x_i-y_i)-2\sum_{i=1}^nx_i*y_i
\]

实际上,因为前面都是定值(\(C\)的取值可以枚举),所以要求

\[\sum_{i=1}^nx_i*y_i
\]

最大就行了。

我们将\(y_i\)反向,那么原式就是一个卷积。

这里有个很巧妙的\(trick\):将\(y\)再倍长一下,取\(x*y\)中第\(n+1\)到\(2n\)项的最小值即可,这样

就很巧妙地模拟了翻转的过程

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (!isdigit(ch) && ch != '-') ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
return w * data;
}
const double PI = acos(-1.0);
const int MAX_N = 2000005;
struct Complex { double x, y; } a[MAX_N], b[MAX_N];
inline Complex operator + (const Complex &l, const Complex &r) { return (Complex){l.x + r.x, l.y + r.y}; }
inline Complex operator - (const Complex &l, const Complex &r) { return (Complex){l.x - r.x, l.y - r.y}; }
inline Complex operator * (const Complex &l, const Complex &r) { return (Complex){l.x * r.x - l.y * r.y, l.y * r.x + l.x * r.y}; }
int n, m, N, M, s1[MAX_N], s2[MAX_N], r[MAX_N], res[MAX_N];
void FFT(Complex *p, int op) {
for (int i = 0; i < N; i++) if (i < r[i]) swap(p[i], p[r[i]]);
for (int i = 1; i < N; i <<= 1) {
Complex rot = (Complex){cos(PI / i), op * sin(PI / i)};
for (int tmp = i << 1, j = 0; j < N; j += tmp) {
Complex w = (Complex){1, 0};
for (int k = 0; k < i; k++, w = w * rot) {
Complex x = p[j + k], y = w * p[i + j + k];
p[j + k] = x + y, p[i + j + k] = x - y;
}
}
}
}
void Prepare () {
N = n - 1, M = n + n - 1;
for (int i = 0; i <= N; i++) a[i].x = s1[i + 1];
for (int i = 0; i < n; i++) b[i].x = s2[n - i];
for (int i = 0; i < n; i++) b[i + n] = b[i];
int P = 0;
for (M += N, N = 1; N <= M; N <<= 1, ++P) ;
for (int i = 0; i < N; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (P - 1));
FFT(a, 1), FFT(b, 1);
for (int i = 0; i < N; i++) a[i] = a[i] * b[i];
FFT(a, -1);
for (int i = 0; i <= M; i++) res[i] = (int)(a[i].x / N + 0.5);
}
int main () {
n = gi(), m = gi();
for (int i = 1; i <= n; i++) s1[i] = gi();
for (int i = 1; i <= n; i++) s2[i] = gi();
Prepare();
int p1 = 0, p2 = 0, ans = 1e9, tmp1 = 0, tmp2 = 0, tt = -1e9;
for (int i = 1; i <= n; i++) p1 += s1[i] * s1[i], p2 += s2[i] * s2[i], tmp1 += s1[i], tmp2 += s2[i];
for (int i = n - 1; i < n + n; i++) tt = max(tt, res[i]);
for (int C = -m; C <= m; C++) {
int tot = p1 + p2 + n * C * C + 2 * C * (tmp1 - tmp2) - 2 * tt;
ans = min(tot, ans);
}
printf("%d\n", ans);
return 0;
}

【LG3723】[AHOI2017/HNOI2017]礼物的更多相关文章

  1. 解题:AHOI2017/HNOI2017 礼物

    题面 先不管旋转操作,只考虑增加亮度这个操作.显然这个玩意的影响是相对于$x,y$固定的,所以可以枚举增加的亮度然后O(1)算出来.为了方便我们把这个操作换种方法表示,只让一个手环改变$[-m,m]$ ...

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

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

  3. P3723 [AH2017/HNOI2017]礼物

    题目链接:[AH2017/HNOI2017]礼物 题意: 两个环x, y 长度都为n k可取 0 ~ n - 1      c可取任意值 求 ∑ ( x[i] - y[(i + k) % n + 1] ...

  4. 【BZOJ4827】 [Hnoi2017]礼物

    BZOJ4827 [Hnoi2017]礼物 Solution 如果一串数的增加,不就等于另一串数减吗? 那么我们可以把答案写成另一个形式: \(ans=\sum_{i=1}^n(x_i-y_i+C)^ ...

  5. 4827: [Hnoi2017]礼物

    4827: [Hnoi2017]礼物 链接 分析: 求最小的$\sum_{i=1}^{n}(x_i-y_i)^2$ 设旋转了j位,每一位加上了c. $\sum\limits_{i=1}^{n}(x_{ ...

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

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

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

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

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

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

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

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

随机推荐

  1. css3优惠券

    <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8" /> <title&g ...

  2. canvas学习笔记1

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. windows下搭建nginx+php开发环境

    windows下搭建nginx+php开发环境 1.前言 windows下大多我们都是下载使用集成环境,但是本地已经存在一个集成环境,但不适合项目的需求.因此准备再自己搭建一个环境. 2.准备 工具: ...

  4. 编程中关于对时区的理解(语言PHP)

    时间戳 首先来说说time()返回的时间戳,时间戳则是自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数. 格林威治 由于地球圆的,因此每个时区的时间 ...

  5. PAT——1068. 万绿丛中一点红

    对于计算机而言,颜色不过是像素点对应的一个24位的数值.现给定一幅分辨率为MxN的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围8个相邻像素的颜色差充分大. 输入 ...

  6. [AHOI2001]多项式乘法

    \([Link](https://www.luogu.org/problemnew/show/P2553)\) \(\color{red}{\mathcal{Description}}\) 给出两个多 ...

  7. windows下nginx访问web目录提示403 Forbidden

    在windows下 http服务器nginx时,访问web目录提示403 Forbidden,首先需要了解nginx出现403错误是什么意思: 403 Forbidden表示你在请求一个资源文件但是n ...

  8. 【Dubbo源码阅读系列】之远程服务调用(上)

    今天打算来讲一讲 Dubbo 服务远程调用.笔者在开始看 Dubbo 远程服务相关源码的时候,看的有点迷糊.后来慢慢明白 Dubbo 远程服务的调用的本质就是动态代理模式的一种实现.本地消费者无须知道 ...

  9. SpringBoot 动态打包

    配置pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  10. 你真的了解Scrum吗?

    敏捷开发是以用户的需求为核心,采用迭代.循序渐进的方法进行软件开发.而Scrum是实现敏捷开发的具体方式之一.然而你对Scrum又了解多少呢? 什么是Scrum Scrum是橄榄球运动的一个专业术语, ...