[Luogu3723] [DarkBZOJ4827]

题解

首先,有一个结论:两个手环增加非负整数亮度,等于其中一个增加一个整数亮度(可以为负)

设增加亮度为x.求\(\sum_{i=1}^{n}(a_{i}+x-b_{i})^2\)

把式子拆开,问题转化为求 \(\sum_{i=1}^{n}a_{i}b_{i}\)的最大值 ,就是一个卷积

[一个套路] : 所以把反过来的数列 \({a}\) 倍长,和数列 \({b}\) 卷积,得到的项里面的第\(n+1\)到\(n*2\)项的最大值,就是原式的最大值

(手模发现有些位置是0,不影响,所以很巧妙的构造出了卷积的答案)

枚举最大值是枚举翻转,同时对于增加的x,由于最大亮度只有100,所以也只需要枚举\([-100,100]\)即可

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<cmath>
  6. #define debug(...) fprintf(stderr,__VA_ARGS__)
  7. #define Debug(x) cout<<#x<<"="<<x<<endl
  8. using namespace std;
  9. typedef long long LL;
  10. const int INF=1e9+7;
  11. inline LL read(){
  12. register LL x=0,f=1;register char c=getchar();
  13. while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
  14. while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
  15. return f*x;
  16. }
  17. const int MAXN=300005;
  18. const double Pi=acos(-1);
  19. namespace F_F_T{
  20. struct cmpx{
  21. double x,y;
  22. cmpx(double xx=0,double yy=0){x=xx,y=yy;}
  23. inline friend cmpx operator + (cmpx a,cmpx b){return cmpx(a.x+b.x,a.y+b.y);}
  24. inline friend cmpx operator - (cmpx a,cmpx b){return cmpx(a.x-b.x,a.y-b.y);}
  25. inline friend cmpx operator * (cmpx a,cmpx b){return cmpx(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
  26. }A[MAXN],B[MAXN];
  27. int r[MAXN],limit=1,l;
  28. inline void FFT(cmpx *A,int type){
  29. for(int i=0;i<limit;i++)
  30. if(i<r[i]) swap(A[i],A[r[i]]);
  31. for(int len=1;len<limit;len<<=1){
  32. cmpx Wn=(cmpx){cos(Pi/len),type*sin(Pi/len)};
  33. for(int j=0;j<limit;j+=(len<<1)){
  34. cmpx w=(cmpx){1,0};
  35. for(int k=0;k<len;k++,w=w*Wn){
  36. cmpx x=A[j+k],y=w*A[j+len+k];
  37. A[j+k]=x+y;
  38. A[j+len+k]=x-y;
  39. }
  40. }
  41. }
  42. }
  43. }using namespace F_F_T;
  44. LL n,m,a1,a2,b1,b2,ans=INF;
  45. int main(){
  46. n=read(),m=read();
  47. for(int i=1;i<=n;i++){
  48. A[i+n].x=A[i].x=read();
  49. a1+=A[i].x;
  50. a2+=A[i].x*A[i].x;
  51. }
  52. for(int i=n;i>=1;i--){
  53. B[i].x=read();
  54. b1+=B[i].x;
  55. b2+=B[i].x*B[i].x;
  56. }
  57. while(limit<=n*3) limit<<=1,l++;
  58. for(int i=0;i<limit;i++)
  59. r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
  60. FFT(A,1);FFT(B,1);
  61. for(int i=0;i<limit;i++) A[i]=A[i]*B[i];
  62. FFT(A,-1);
  63. for(int i=0;i<limit;i++)
  64. A[i].x=(LL)(A[i].x/limit+0.5);
  65. for(int i=n+1;i<=(n<<1);i++)
  66. for(int j=-m;j<=m;j++)
  67. ans=min(ans,a2+b2+n*j*j+2ll*j*(a1-b1)-2ll*(LL)A[i].x);
  68. printf("%lld\n",ans);
  69. }

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

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

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

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

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

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

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

  4. P3723 [AH2017/HNOI2017]礼物

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

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

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

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

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

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

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

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

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

  9. [AH2017/HNOI2017] 礼物 解题报告 (FFT)

    题目链接: https://www.luogu.org/problemnew/show/P3723 题目: 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自 ...

随机推荐

  1. Qt creator 使用qwt

    .pro中添加 LIBS += -L”C:\Qt\Qt5.3.2\5.3\msvc2013_opengl\lib” -lqwt INCLUDEPATH += "C:\Qt\Qt5.3.2\5 ...

  2. 记一次完整的android源码截屏事件的捕获<标记砖>

    http://blog.csdn.net/buptgshengod/article/details/19911909?utm_source=tuicool&utm_medium=referra ...

  3. python 爬虫 下载图片

    import os#导入操作系统模块from urllib.request import urlretrieve#下载url对应的文件from urllib.request import urlope ...

  4. PHP trim() 函数

    定义和用法 trim() 函数从字符串的两端删除空白字符和其他预定义字符. 语法 trim(string,charlist) 参数 描述 string 必需.规定要检查的字符串. charlist 可 ...

  5. docker学习(2)基本命令

    原文地址:http://blog.csdn.net/we_shell/article/details/38368137 1. 查看docker信息(version.info) # 查看docker版本 ...

  6. ARC059F

    传送门 分析 见ptx大爷博客 代码 #include<iostream> #include<cstdio> #include<cstring> #include& ...

  7. windows平台下用C#访问HBase

    Hadoop中的HBase有多种数据访问方式,ubuntu里可以用hbase shell查看操作hbase数据库,但windows平台下需要用thrift对它进行访问. 例如hadoop安装在/usr ...

  8. Spark的广播变量模块

    有人问我,如果让我设计广播变量该怎么设计,我想了想说,为啥不用zookeeper呢? 对啊,为啥不用zookeeper,也许spark的最初设计哲学就是尽量不使用别的组件,他有自己分布式内存文件系统, ...

  9. 数据结构_XingYunX(幸运儿)

    数据结构_XingYunX(幸运儿) 问题描述 泡泡最近下了个饱了吗 app,这个 app 推出了个坑蒙拐骗的红包系统,只要花一块钱买张一元抵用券,就有参与 20 元红包的抽奖机会,抽奖界面会实时显示 ...

  10. com.fasterxml.jackson.databind.JavaType.isReferenceType

    <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-map ...