首页 > 其他分享 >P3723 [AH2017/HNOI2017]礼物(FFT)

P3723 [AH2017/HNOI2017]礼物(FFT)

时间:2023-05-11 20:11:10浏览次数:52  
标签:样例 sum FFT 手环 P3723 len HNOI2017 亮度 装饰物

P3723 [AH2017/HNOI2017]礼物(FFT)

目录

题目传送门

[AH2017/HNOI2017]礼物

题目描述

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

但是在她生日的前一天,我的室友突然发现他好像拿错了一个手环,而且已经没时间去更换它了!他只能使用一种特殊的方法,将其中一个手环中所有装饰物的亮度增加一个相同的非负整数 \(c\)。并且由于这个手环是一个圆,可以以任意的角度旋转它,但是由于上面装饰物的方向是固定的,所以手环不能翻转。需要在经过亮度改造和旋转之后,使得两个手环的差异值最小。

在将两个手环旋转且装饰物对齐了之后,从对齐的某个位置开始逆时针方向对装饰物编号 \(1 \sim n\),其中 \(n\) 为每个手环的装饰物个数, 第 \(1\) 个手环的 \(i\) 号位置装饰物亮度为 \(x_i\),第 \(2\) 个手环的 \(i\) 号位置装饰物亮度为 \(y_i\),两个手环之间的差异值为(参见输入输出样例和样例解释):

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

麻烦你帮他计算一下,进行调整(亮度改造和旋转),使得两个手环之间的差异值最小,这个最小值是多少呢?

输入格式

输入数据的第一行有两个数 \(n,m\),代表每条手环的装饰物的数量为 \(n\),每个装饰物的初始亮度小于等于 \(m\)。

接下来两行,每行各有 \(n\) 个数,分别代表第一条手环和第二条手环上从某个位置开始逆时针方向上各装饰物的亮度。

输出格式

输出一个数,表示两个手环能产生的最小差异值。注意在将手环改造之后,装饰物的亮度可以大于 \(m\)。

样例 #1

样例输入 #1

5 6
1 2 3 4 5
6 3 3 4 5

样例输出 #1

1

提示

【样例解释】

需要将第一个手环的亮度增加 \(1\),第一个手环的亮度变为:\(2,3,4,5,6\)

旋转一下第二个手环。对于该样例,是将第二个手环的亮度 \(6,3,3,4,5\) 向左循环移动一个位置,使得第二手环的最终的亮度为:\(3,3,4,5,6\)。

此时两个手环的亮度差异值为 \(1\)。

【数据范围】

对于 \(30\%\) 的数据,\(n \le 500\),\(m \le 10\);

对于 \(70\%\) 的数据,\(n \le 5000\);

对于 \(100\%\) 的数据,\(1 \le n \le 50000\), \(1 \le a_i \le m \le 100\)。

思路

这是一个 \(FFT\) 转换题,不会的可以看这个

题意

给定两个数组 \(a , b\) ,\(b\) 可以循环移动,选择整数 \(c\in[-m , m]\) , 求 \(\sum_{i = 1}^n(a_i-b_i+c)^2\) 的最小值

分析

我们可以化简一下式子:

\[\begin{aligned} \sum_{i = 1}^n(a_i - b_i +c)^2 &= \sum_{i = 1}^n(a_i-b_i)^2+c^2+2c(a_i-b_i) \newline &= \sum_{i = 1}^n(a_i^2+b_i^2)-2a_ib_i+c^2+2a_ic-2b_ic \newline &=\sum_{i = 1}^na_i^2+\sum_{i = 1}^n b_i^2-2\sum_{i = 1}^na_ib_i+nc^2+2c\sum_{i = 1}^n(a_i-b_i) \end{aligned} \]

显然前两项是定值。

后面的两项是关于 \(c\) 的二次函数,求对称轴,找到对称轴最近的两个整数坐标比较一下就好了。

所以问题就转换成了求最大的 \(\sum_{i = 1}^na_ib_i\)

先破环为链,即 \(b_{i + n}=b_i\) ,就不用管环了

考虑把 \(b\) 移动 \(k\) 位时候的答案: \(\sum_{i = 1}^na_ib_{i+k}\)

翻转 \(a\) 数组后:\(\sum_{i = 1}^n a_{n - i + 1}b_{i + k}\)

发现变成了一个卷积

就可以用 \(FFT\) 了。

#include <bits/stdc++.h>
#define fu(x, y, z) for (int x = y; x <= z; x++)
#define fd(x, y, z) for (int x = y; x >= z; x--)
#define LL long long
using namespace std;
const int N = (1 << 18);
const double pi = acos(-1.0);
struct node {
    double x, y;
} A[N], B[N];
int n, m, a[N], b[N], n1, m1, n2;
node operator + (node a, node b) { return (node){a.x + b.x , a.y + b.y};}
node operator - (node a, node b) { return (node){a.x - b.x , a.y - b.y};}
node operator * (node a, node b) { return (node){a.x * b.x - a.y * b.y , a.x * b.y + a.y * b.x};}
LL rev[N], sum[N], ans1, ans, t;
int read() {
    int val = 0, fu = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')
            fu = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        val = val * 10 + (ch - '0');
        ch = getchar();
    }
    return val * fu;
}
void fft(int len, node *a, int inv) {
    if (len == 1)
        return;
    node a1[(len >> 1) + 5], a2[(len >> 1) + 5];
    for (int i = 0; i <= len; i += 2) {
        a1[i >> 1] = a[i], a2[i >> 1] = a[i + 1];
    }
    fft(len >> 1, a1, inv);
    fft(len >> 1, a2, inv);
    node wn = (node){ cos(2.0 * pi / len), inv * sin(2.0 * pi / len) }, w = (node){ 1, 0 };
    for (int i = 0; i < (len >> 1); i++, w = w * wn) {
        a[i] = a1[i] + w * a2[i];
        a[i + (len >> 1)] = a1[i] - w * a2[i];
    }
}
void solve() {
    fu(i, 0, n1) A[i].x = a[i + 1];
    fu(i, 0, m1) B[i].x = b[i + 1];
    int len = 1;
    while (len <= n1 + m1) len <<= 1;
    fft(len, A, 1), fft(len, B, 1);
    fu(i, 0, len) A[i] = A[i] * B[i];
    fft(len, A, -1);
    fu(i, 0, m1 + n1 + 1) rev[i] = (LL)(A[i].x / len + 0.5);
}
int main() {
    n = read(), m = read();
    n1 = n - 1, n2 = (n << 1);
    m1 = n2 - 1;
    fu(i, 1, n) a[i] = read();
    fu(i, 1, n) b[i] = read();
    fu(i, 1, n) {
        t += b[i] - a[i];
        ans += a[i] * a[i] + b[i] * b[i];
        b[i + n] = b[i];
    }
    int c1 = floor(t * 1.0 / n), c2 = ceil(t * 1.0 / n);
    ans += min(n * c1 * c1 - 2 * c1 * t, n * c2 * c2 - 2 * c2 * t);
    reverse(a + 1, a + n + 1);
    solve();
    fu (i , 0 , n) ans1 = max (ans1 , rev[i + n]);
    ans -= ans1 * 2;
    printf("%lld", ans);
    return 0;
}

标签:样例,sum,FFT,手环,P3723,len,HNOI2017,亮度,装饰物
From: https://www.cnblogs.com/2020fengziyang/p/17392107.html

相关文章

  • FFT(快速傅里叶变换)
    FFT(快速傅里叶变换)目录FFT(快速傅里叶变换)前言多项式的系数表示法和点值表示法系数表示法点值表示法高精度乘法下两种多项式表示法的区别前言又要补之前的知识,艹。快速傅里叶变换(fastFouriertransform),即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简......
  • FFT 精度误差分析
    可能写的有错的,也可能没有,大家看着当个乐子就好。FFT是oi中常用的一种算法,但是我们没有关心过它的精度,所以我们现在来关心一下。我们知道对于一个长度为\(n\)的向量\(\alpha\),我们对它做DFT,相当于左乘了一个正交矩阵\(T\)(我们知道常规的DFT中做的不是标准的正交变换,但......
  • FFT学习笔记
    快速傅里叶变换多项式定义不严谨定义:形如\(f(x)=\sum\limits_{i=0}^{n}a_ix^i\)的式子为多项式。定义(fromOIWiki):对于求和式\(\suma_nx^n\),如果是有限项相加,称为多项式,记作\(f(x)=\sum\limits_{n=0}^ma_nx^n\)。次数:对于多项式\(F(x)=\sum\limits_{i=0}^{n......
  • FFT&NTT学习笔记
    概念多项式乘法时,我们发现暴力乘十分缓慢,但是点值乘十分快速。考虑求\(A\)和\(B\)的卷积。一个\(n\)次多项式可以被\(n+1\)个点确定。设多项式\(A(x)\)的系数为\((a_0,a_1,\cdots,a_n)\)对其奇偶分类得\(A(x)=\sum\limitsa_{2i}*x^{2i}+\suma_{2i+1}*x^{2i+1}\)......
  • 快速傅里叶变换FFT学习笔记
    点值表示法我们正常表示一个多项式的方式,形如\(A(x)=a_0+a_1x+a_2x^2+...+a_nx^n\),这是正常人容易看懂的,但是,我们还有一种表示法。我们知道,\(n+1\)个点可以表示出一个\(n\)次的多项式。于是,我们任意地取\(n+1\)个不同的值,表示\(x\),求出的值与\(x\)对应,形成\(n+1\)个......
  • 示波器数据导入MATLAB进行FFT分析的方法
      http://blog.sina.com.cn/s/blog_710421fa0101crm1.htmlpower_fftscope;示波器保存为.csv格式文件,然后用matlab导入新建.mdl模型文件,示波器里面变量保存为uuuu.time=seconduu.signals.values=Volt在工作台运行上面两条指令,直到FFT分析几面里面出现波形,就可以分析了!1......
  • FFT笔记
    FFT笔记前言:这个算法对于我来讲比较抽象、高深,因为里面涉及了一些复数等一些对我而言很难很难的知识。终于,花了几节文化课的时间冥思苦想,终于算是搞懂一点了。所以我决定趁脑子清醒的时候记录下来。与其他文章不同的是,本文可能没有太多的公式证明,主要是以通俗易懂的方式去讲......
  • vicky自己都看不懂的FFT&NTT&FWT(目前只完成FFT部分
    打个广告QwQ对应的FFT洛谷blog链接对应的csdn博客链接个人觉得洛谷的观感最好。不忘历史八百年前学了\(\text{FFT}\),因vicky过于垃圾,遂放弃。七百年前重拾\(\text{FFT}\),勉强搞懂了它的递归写法,因vicky再一次懒癌附体,遂连板题都没写就弃疗了。历史的今天(是今天才怪),vick......
  • mafft 软件的安装
     001、condainstall-cbiocondamafft 002、查看版本(base)root@DESKTOP-IDT9S0E:/home/test#mafft--versionv7.310(2017/Mar/17) ......
  • 关于FFT频域的记录
    FFT是纹理检测的一种办法,而缺陷检测属于纹理检测的一部分。要想检测缺陷,基本思路是:(1)fft变换(2)卷积滤波(一般为了得到图像的高频部分)(3)fft逆变换(4)到这一步缺陷被变得更明显,提取缺陷部分就容易很多。 先说说一些名词概念:图像的时域形式:时域原义是现实世界的以时间为尺寸衡量变化量......