题目链接

描述

两个序列 \(x, y\),可以将一个序列每个值同时加非负整数 \(c\),其中一个序列可以循环移位,要求最小化:

\[\sum_{i = 1}^{n}(x_i - y_i) ^ 2
\]

题解

循环移位 \(\Leftrightarrow\) 断环成链。显然那个序列循环移位不影响,而且强制加值在 \(x\) 上, \(c\) 可以为负整数(可以理解为如果是负数,则把这个的绝对值加到 \(y\) 上,差保持不变),不妨让 y 移位,将 y 数组复制一倍到末尾,由于循环移位,所以 \(\sum_{i=1}^{n} y_{j + i} = \sum_{i=1}^{n} y_i\)。

\[ans = \min\{ \sum_{i = 1}^{n} (x_i + c - y_{j + i}) ^ 2 \}
\]

把里面这个东西拿出来:

\[\sum_{i = 1}^{n} (x_i + c - y_{j + i}) ^ 2 = \sum_{i=1}^{n}x_i ^ 2 + \sum_{i=1}^{n}y_i^2 + nc^2 + 2c\sum(x_i - y_i) - 2 \sum x_i y_{i + j}
\]

要让这个式子尽量小:

  • 前两项是定值
  • 第 \(3, 4\) 项是一个关于 \(c\) 的开口向上二次函数,由于要求取整数,所以算对称轴,算一下最近的两个整数取最优值即可。

比较棘手的是最后一项 \(\sum x_i y_{i + j}\) (可以忽略系数),感觉可以转化成卷积的形式,用套路性的反转序列试试看:

新建一个数组 \(z\),令 \(z_{2n - i + 1} = y_i\)

\(\sum x_i y_{i + j} = \sum x_i z_{2n + 1 - i - j}\),很显然的一个卷积,即从 \(j\) 位开始的答案记录在了 \(2n - j + 1\) 位的系数上。

Tips

  • C++ 如果是负数整除会上取整,注意特判

时间复杂度

\(O(Nlog_2N)\)

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cmath>
  5. using namespace std;
  6. typedef long long LL;
  7. const int N = 2e5 + 5;
  8. const double PI = acos(-1);
  9. int n, m, c, lim = 1, len, rev[N], x[N], y[N];
  10. LL ans = 0;
  11. struct CP{
  12. double x, y;
  13. CP operator + (const CP &b) const { return (CP){ x + b.x, y + b.y }; }
  14. CP operator - (const CP &b) const { return (CP){ x - b.x, y - b.y }; }
  15. CP operator * (const CP &b) const { return (CP){ x * b.x - y * b.y, x * b.y + y * b.x }; }
  16. } F[N], G[N];
  17. void FFT(CP a[], int opt) {
  18. for (int i = 0; i < lim; i++) if (i < rev[i]) swap(a[i], a[rev[i]]);
  19. for (int m = 1; m <= lim; m <<= 1) {
  20. CP wn = (CP){ cos(2 * PI / m), opt * sin(2 * PI / m) };
  21. for (int i = 0; i < lim; i += m) {
  22. CP w = (CP){ 1, 0 };
  23. for (int j = 0; j < (m >> 1); j++) {
  24. CP u = a[i + j], t = w * a[i + j + (m >> 1)];
  25. a[i + j] = u + t, a[i + j + (m >> 1)] = u - t;
  26. w = w * wn;
  27. }
  28. }
  29. }
  30. }
  31. int main() {
  32. scanf("%d%d", &n, &m);
  33. for (int i = 1; i <= n; i++) scanf("%d", x + i), ans += x[i] * x[i], c += x[i];
  34. for (int i = 1; i <= n; i++) scanf("%d", y + i), y[i + n] = y[i], ans += y[i] * y[i], c -= y[i];
  35. // x = l 是对称轴
  36. int l = -c / n;
  37. if (c > 0) l--;
  38. ans += min(l * l * n + 2 * l * c, (l + 1) * (l + 1) * n + 2 * (l + 1) * c);
  39. LL v = 0;
  40. for (int i = 1; i <= n; i++) F[i].x = x[i];
  41. for (int i = 1; i <= 2 * n; i++) G[i].x = y[2 * n - i + 1];
  42. while (lim <= 2 * n) lim <<= 1, ++len;
  43. for (int i = 0; i < lim; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (len - 1));
  44. FFT(F, 1); FFT(G, 1);
  45. for (int i = 0; i < lim; i++) F[i] = F[i] * G[i];
  46. FFT(F, -1);
  47. for (int i = n + 1; i <= 2 * n; i++) v = max(v, (LL)(F[i].x / lim + 0.5));
  48. printf("%lld\n", ans - 2 * v);
  49. return 0;
  50. }

AH/HNOI 2017 礼物的更多相关文章

  1. [HNOI 2017]礼物

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

  2. 【HNOI 2017】礼物

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

  3. [HNOI 2017]单旋

    Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的 ...

  4. [HNOI 2017]抛硬币

    Description 题库链接 两人抛硬币一人 \(a\) 次,一人 \(b\) 次.记正面朝上多的为胜.问抛出 \(a\) 次的人胜出的方案数. \(1\le a,b\le 10^{15},b\l ...

  5. [HNOI 2017]影魔

    Description 题库链接 给你一段长度为 \(n\) 的序列 \(K\) . \(m\) 组询问,每次给定左右端点 \(l,r\) .求出满足区间内下述贡献和. 如果一个区间的两个端点是这一个 ...

  6. 【HNOI 2017】大佬

    Problem Description 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语.你作为一个 OIer, ...

  7. 【HNOI 2017】影魔

    Problem Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还 ...

  8. HNOI 2017

    题目链接 我还是按bzoj AC数量排序做的 4827 这个其实如果推一下(求每个值)式子会发现是个卷积,然后FFT就好了 4826 记不太清了,可以求出每个点左右第一个比他的的点的位置,将点对看成平 ...

  9. [HNOI 2017]大佬

    Description 题库链接 题意简述来自Gypsophila. 你现在要怼 \(m\) 个大佬,第 \(i\) 个大佬的自信值是 \(C_i\) .每次怼大佬之前,你的自信值是 \(mc\),等 ...

随机推荐

  1. 流编辑器:sed

    一 简介:sed是一个精简的.非交互式的流式编辑器,它在命令行中输入编辑命令和指定文件名,然后在屏幕上查看输出.逐行读取文件内容到临时缓冲区,称为模式空间.接着用sed命令处理缓冲区内容,处理完之后, ...

  2. 创建Grafana监控视图

    前言 Grafana允许查询,可视化,警报和了解指标,无论它们存储在哪里. 可视化:具有多种选项的快速灵活的客户端图.面板插件提供了许多不同的方式来可视化指标和日志. 动态仪表盘:使用模板变量创建动态 ...

  3. 数据结构实训——哈夫曼(Huffman)编/译码器

    题目4.哈夫曼(Huffman)编/译码器(限1人完成) [问题描述] 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本.但是,这要求在发送端通过一个编码系统对待传数据预先 ...

  4. 从 Webpack 到 Snowpack, 编译速度提升十倍以上——TRPG Engine迁移小记

    动机 TRPG Engine经过长久以来的迭代,项目已经显得非常臃肿了.数分钟的全量编译, 每次按下保存都会触发一次10s到1m不等的增量编译让我苦不堪言, 庞大的依赖使其每一次编译都会涉及很多文件和 ...

  5. xss攻击与防范

    xss攻击方式以及防范 通常来说,网站一般都是有着,用户注册,用户登录,实名认证等等这些需要用户把信息录入数据库的接口 xss找的就是这种接口,他们可以在传递数据的时候,传递恶意的  script  ...

  6. Appium上下文和H5测试(一)

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.混合应用-H5 1.混合应用是什么? 2.怎么样分辨一个 App 页面究竟是原生的还是 We ...

  7. 如何使用iMindMap制作更专业的时间计划

    时间计划无论是在日常生活中,还是在工作中,都显得极为重要.小到每周的购物时间规划,大到大型项目的时间管理,时间计划都会如影随形.虽然时间计划很重要,但很多人都会忽视这种重要性,可能只会在台本日历上作一 ...

  8. FL Studio钢琴卷轴之工具菜单的Riff命令

    鼠标左键点击FL Studio钢琴卷轴窗口中的"工具"命令,我们就可以打开快捷工具菜单.快捷菜单中包含了用于音符编辑的各种工具.按照该菜单的顺序,我们先来看一下什么是Riff器命令 ...

  9. 思维导图iMindMap怎么做大型项目管理

    在大型企业中,有许多大型而复杂的项目,你要考虑内外部因素.期限以及你要达成的目标等等,所以我们要进行项目管理.下面小编教你怎么用iMindMap思维导图进行项目管理. iMindMap有一个工作区,以 ...

  10. 【电子取证:镜像仿真篇】Windows Server镜像仿真、vmdk镜像仿真

    Windows Server镜像仿真.vmdk镜像仿真 时间过得真快呀!--[suy999] Windows Server镜像仿真.vmdk镜像仿真 一.qemu-img镜像转换工具 (一)raw.q ...