题目链接:

https://www.luogu.org/problemnew/show/P3723

题目:

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

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

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

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

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

题解:

差异值=$\sum_{i=1}^{n}(a_i+x-b_i)^2$

$\sum_{i=1}^na_i^2+\sum_{i=1}^{n}b_i^2+nx^2+2x(\sum_{i=1}{n}a_i-\sum_{i=1}{n}b_i)-2\sum_{i=1}^{n}a_ib_i$

我们枚举$x(-m<=x<=m)$,发现除了最后一项都是定值

那么我们另最后一项最大即可

由于$a$,$b$其实都是可以旋转的,那么我们把$a$倍长

末项$=\sum_{i=x}^{n+x-1}a_ib_{i-x+1}$

再按照套路把$b$反向,$b_i=b_{n-i+1}$

末项$=\sum_{i=x}^{n-x+1}a_ib_{n-i+x}$

$=\sum_{i=1}^{n}a_{i-1+x}b_{n-i+1}$

这显然是一个卷积的形式,即把$a$与$b$卷起来的第$n+x$项

代码:

  1. #include<algorithm>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<iostream>
  5. #include<cmath>
  6. using namespace std;
  7. typedef double db;
  8. typedef long long ll;
  9.  
  10. const int N=1e6+;
  11. const ll inf=1e18;
  12. const db pi=acos(-1.0);
  13. int r[N];
  14. struct complex
  15. {
  16. db x,y;
  17. complex (db xx=,db yy=) {x=xx;y=yy;}
  18. }A[N],B[N];
  19. complex operator + (complex a,complex b) {return complex(a.x+b.x,a.y+b.y);}
  20. complex operator - (complex a,complex b) {return complex(a.x-b.x,a.y-b.y);}
  21. complex operator * (complex a,complex b) {return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
  22. inline int read()
  23. {
  24. char ch=getchar();int s=,f=;
  25. while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
  26. while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
  27. return s*f;
  28. }
  29. void fft(int limit,complex *a,int type)
  30. {
  31. for (int i=;i<limit;i++) if (i<r[i]) swap(a[i],a[r[i]]);
  32. for (int len=;len<limit;len<<=)
  33. {
  34. complex wn=complex(cos(pi/len),type*sin(pi/len));
  35. for (int k=;k<limit;k+=(len<<))
  36. {
  37. complex w=complex(,);
  38. for (int l=;l<len;l++,w=w*wn)
  39. {
  40. complex Nx=a[k+l],Ny=w*a[k+len+l];
  41. a[k+l]=Nx+Ny;
  42. a[k+len+l]=Nx-Ny;
  43. }
  44. }
  45. }
  46. }
  47. int n,m;
  48. int a[N],b[N];
  49. int main()
  50. {
  51. ll a1=,b1=,a2=,b2=;
  52. n=read();m=read();
  53. for (int i=;i<=n;i++) a[i]=read(),a1+=a[i],a2+=a[i]*a[i];
  54. for (int i=;i<=n;i++) b[i]=read(),b1+=b[i],b2+=b[i]*b[i];
  55.  
  56. for (int i=;i<=n;i++)
  57. {
  58. A[i].x=A[i+n].x=a[i];
  59. B[i].x=b[n-i+];
  60. }
  61.  
  62. int limit=,l=;
  63. while (limit<n+n+n) limit<<=,++l;
  64. for (int i=;i<limit;i++) r[i]=(r[i>>]>>)|((i&)<<(l-));
  65.  
  66. fft(limit,A,);fft(limit,B,);
  67. for (int i=;i<=limit;i++) A[i]=A[i]*B[i];
  68. fft(limit,A,-);
  69. for (int i=;i<=limit;i++) A[i].x=(ll)(A[i].x/limit+0.5);
  70.  
  71. ll ans=inf;
  72. for (int x=;x<=n;x++)
  73. for (int z=-m;z<=m;z++)
  74. ans=min(ans,a2+b2+n*z*z+2ll*z*(a1-b1)-2ll*(ll)A[x+n].x);
  75. printf("%lld\n",ans);
  76. return ;
  77. }

[AH2017/HNOI2017] 礼物 解题报告 (FFT)的更多相关文章

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

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

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

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

  3. P3723 [AH2017/HNOI2017]礼物

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

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

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

  5. LUOGU P3723 [AH2017/HNOI2017]礼物 (fft)

    传送门 解题思路 首先我们设变化量为\(r\),那么最终的答案就可以写成 : \[ ans=min(\sum\limits_{i=1}^n(a_i-b_i+r)^2) \] \[ ans=min(\s ...

  6. [AH2017/HNOI2017]礼物(FFT)

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

  7. [AH2017/HNOI2017]礼物(FFT)

    [Luogu3723] [DarkBZOJ4827] 题解 首先,有一个结论:两个手环增加非负整数亮度,等于其中一个增加一个整数亮度(可以为负) 设增加亮度为x.求\(\sum_{i=1}^{n}(a ...

  8. 洛谷P3723 [AH2017/HNOI2017]礼物(FFT)

    传送门 首先,两个数同时增加自然数值相当于只有其中一个数增加(此增加量可以小于0) 我们令$x$为当前的增加量,${a},{b}$分别为旋转后的两个数列,那么$$ans=\sum_{i=1}^n(a_ ...

  9. [AH2017/HNOI2017]礼物

    题解: 水题 化简一波式子会发现就是个二次函数再加上一个常数 而只有常数中的-2sigma(xiyi)是随移动而变化的 所以只要o(1)求出二次函数最大值然后搞出sigma(xiyi)就可以了 这个东 ...

随机推荐

  1. idea 中web项目 用自带tomcat启动问题,

    严重: Exception sending context initialized event to listener instance of class com.zenointel.logserve ...

  2. java old GC和young GC

    Java内存分配机制 摘自:http://www.cnblogs.com/zhguang/p/3257367.html 这里所说的内存分配,主要指的是在堆上的分配,一般的,对象的内存分配都是在堆上进行 ...

  3. GCD的小结

    同步和异步的区别 同步:在当前线程中执行 异步:在另一条线程中执行 有4个术语比较容易混淆:同步.异步.并发.串行 同步和异步决定了要不要开启新的线程 同步:在当前线程中执行任务,不具备开启新线程的能 ...

  4. canvas绘制饼型图

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

  5. Android设计模式——工厂方法模式

    1.定义:工厂方法模式就是定义一个用于创建对象的接口,让子类决定实例化哪个类. 2.看代码: 产品抽象类 public abstract class Product { /** * 产品类抽象方法 * ...

  6. SwipeRefreshLayout实现下拉刷新上滑加载

    1. 效果图 2.RefreshLayout.java package myapplication.com.myapplication; import android.content.Context; ...

  7. Powerpivot PowerBI相关组件下载安装(附操作截图)

    加载方式:com加载项加载方法: 点击Excel界面[文件]→[选项]→[加载项]→[COM加载项]→[转到] Excel2013加载PowerView Excel216PowerQuery不需要加载 ...

  8. Unity3d 拖拽脚本报错 Can’t add script

    报错截图: 报错原因: c#文件创建以后再改名,会报错找不到对应类. 类名和文件名要一致才行.(这个是Unity要求,c#本身不要求一致)

  9. 第四章 Python之文件处理

    文件操作 文件操作一般分为三步:打开文件得到文件句柄并赋值给一个变量--->通过句柄对文件进行操作-->关闭文件 f=open(r'C:\Users\hesha\PycharmProjec ...

  10. Use gdb attach pid and debug it