题目大意

有两个长度为\(n\)(\(n\leq5*10^4\))的数列\(x_1,x_2,...,x_n\)和\(y_1,y_2,...,y_n\),两个数列里的数都不超过\(m\)(\(m\leq100\))

现在可以进行“(1)把\(x\)中的所有数同时加上一个值”和“\(i<n\)时,\((2)x_i\)变成\(x_{i+1}\);\(i=n\)时,\(x_i\)变成\(x_1\)”这两种操作

操作任意次,使\(\Sigma_{i=1}^{n}{(x_i-y_i)^2}\)最小

题解

设(1)操作加上的值为\(k\),(2)操作执行了\(j\)次;定义\(add(a,b)\)在\(a+b\leq n\)时为\(a+b\),否则为\(a+b-n\)

那么就是要选出合适的\(k,j\),使\(\Sigma_{i=1}^{n}{(x_i+k-y_{add(i,j)})^2}\)最小

该式=\(\Sigma_{i=1}^{n}{(x_i^2+k^2-y_{add(i,j)}^2+2*x_i*k-2*x_i*y_{add(i,j)}-2*k*y_{add(i,j)})}\)

=\((\Sigma_{i=1}^{n}x_i^2)+(\Sigma_{i=1}^{n}y_i^2)+n*k^2+(\Sigma_{i=1}^{n}{(2*x_i*k-2*x_i*y_{add(i,j)}-2*k*y_{add(i,j)})})\)

其中\((\Sigma_{i=1}^{n}x_i^2)+(\Sigma_{i=1}^{n}y_i^2)\)是定值,要让剩下的部分\(n*k^2+(\Sigma_{i=1}^{n}{(2*x_i*k-2*x_i*y_{add(i,j)}-2*k*y_{add(i,j)})})\)更小

该式=\(n*k^2+(\Sigma_{i=1}^{n}{(2*k*(x_i-y_{add(i,j)})-2*x_i*y_{add(i,j)}})\)

=\(n*k^2+(\Sigma_{i=1}^{n}{2*k*(x_i-y_{add(i,j)})})-(\Sigma_{i=1}^{n}{2*x_i*y_{add(i,j)}})\)

=\(n*k^2+2*k*((\Sigma_{i=1}^{n}{x_i})-(\Sigma_{i=1}^{n}{y_i}))-(\Sigma_{i=1}^{n}{2*x_i*y_{add(i,j)}})\)

将它分成两部分,第一部分是\(n*k^2+2*k*((\Sigma_{i=1}^{n}{x_i})-(\Sigma_{i=1}^{n}{x_i}))\),第二部分是\((\Sigma_{i=1}^{n}{2*x_i*y_{add(i,j)}})\)

第一部分只和\(k\)有关,第二部分只和\(j\)有关

那就可以分别算出\(k\)为\(-m\)到\(m\)时第一部分的取值,分别算出\(j\)为\(0\)到\(n-1\)时第二部分的取值,再枚举\(k,j\)的值

发现第二部分是个卷积式,算这部分的时间复杂度围为\(\Theta(n*log n)\)

总时间复杂度是\(\Theta(n*log n+n*m)\)

代码
  1. #include<algorithm>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<ctime>
  7. #include<iomanip>
  8. #include<iostream>
  9. #include<map>
  10. #include<queue>
  11. #include<set>
  12. #include<stack>
  13. #include<vector>
  14. #define rep(i,x,y) for(register int i=(x);i<=(y);++i)
  15. #define dwn(i,x,y) for(register int i=(x);i>=(y);--i)
  16. #define maxn 50010
  17. #define maxm (maxn*6)
  18. #define inf 2147483647
  19. #define LL long long
  20. using namespace std;
  21. int read()
  22. {
  23. int x=0,f=1;char ch=getchar();
  24. while(!isdigit(ch)&&ch!='-')ch=getchar();
  25. if(ch=='-')f=-1,ch=getchar();
  26. while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
  27. return x*f;
  28. }
  29. void write(int x)
  30. {
  31. if(x==0){putchar('0'),putchar('\n');return;}
  32. int f=0;char ch[20];
  33. if(x<0)putchar('-'),x=-x;
  34. while(x)ch[++f]=x%10+'0',x/=10;
  35. while(f)putchar(ch[f--]);
  36. putchar('\n');
  37. return;
  38. }
  39. const LL mod = 998244353;
  40. int ans,m,n,fakeans[maxn],x[maxn],y[maxn],sumx,sumy,ans2,a[maxm],b[maxm],nown,len,r[maxm];
  41. int mul(int x,int y){int res=1;while(y){if(y&1)res=(LL)res*(LL)x%mod;x=(LL)x*(LL)x%mod,y>>=1;}return res;}
  42. void dnt(int * c,int f)
  43. {
  44. rep(i,0,nown-1){r[i]=(r[i>>1]>>1)|((i&1)<<(len-1));}
  45. rep(i,0,nown-1){if(i<r[i])swap(c[i],c[r[i]]);}
  46. for(int i=1;i<nown;i<<=1)
  47. {
  48. int wn=mul(3,(mod-1)/(i<<1)),xx,yy;
  49. if(f==-1)wn=mul(wn,mod-2);
  50. for(int j=0;j<nown;j+=(i<<1))
  51. {
  52. int w=1;
  53. rep(k,0,i-1)xx=c[j+k]%mod,yy=(LL)w*(LL)c[j+i+k]%mod,c[j+k]=(xx+yy)%mod,c[j+i+k]=(xx-yy+mod)%mod,w=(LL)w*(LL)wn%mod;
  54. }
  55. }
  56. if(f==-1){int inv=mul(nown,mod-2);rep(i,0,nown-1)c[i]=(LL)c[i]*(LL)inv%mod;}
  57. }
  58. int main()
  59. {
  60. n=read(),m=read();
  61. rep(i,1,n)x[i]=read(),sumx+=x[i],ans2+=x[i]*x[i];
  62. rep(i,1,n)y[i]=read(),sumy+=y[i],ans2+=y[i]*y[i];
  63. rep(i,0,n-1)a[i]=x[i+1];
  64. rep(i,n,(n<<1)-1)a[i]=x[i-n+1];
  65. rep(i,0,n)b[i]=y[n-i]*2;
  66. for(nown=1,len=0;nown<(n+n+n-1);nown<<=1)len++;
  67. dnt(a,1),dnt(b,1);
  68. rep(i,0,nown-1)a[i]=(LL)a[i]*(LL)b[i]%mod;
  69. dnt(a,-1);
  70. rep(i,0,n-1)fakeans[i]=a[i+n-1];
  71. ans=inf;
  72. rep(k,-m,m)rep(j,0,n-1)ans=min(ans,2*k*(sumx-sumy)+n*k*k-fakeans[j]);
  73. write(ans+ans2);
  74. return 0;
  75. }
  76. /*
  77. 5 6
  78. 1 2 3 4 5
  79. 6 3 3 4 5
  80. */
一些感想

还有一百天左右!

并不对劲的bzoj4827:loj2020:p3723:[AHOI/HNOI2017]礼物的更多相关文章

  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. 洛谷P3723 [AH2017/HNOI2017]礼物(FFT)

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

  5. 洛谷P3723 [AH2017/HNOI2017]礼物

    吴迪说他化学会考上十分钟就想出来了,太神了%%%不过我也十分钟 但是调了一个多小时啊大草 懒得人话翻译了,自己康吧: 我的室友(真的是室友吗?)最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决 ...

  6. AHOI/HNOI2017 礼物

    题目链接:戳我 对于题目中给的式子:(大家暂且把\(y_i\)当作\(y_{i+k}\)来看啦qwq) \(\sum_{i=1}^{n}(x_i-(y_i+c))^2\) \(=\sum_{i=1}^ ...

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

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

  8. loj#2020 「AHOI / HNOI2017」礼物 ntt

    loj#2020 「AHOI / HNOI2017」礼物 链接 bzoj没\(letex\),差评 loj luogu 思路 最小化\(\sum\limits_1^n(a_i-b_i)^2\) 设改变 ...

  9. 「AHOI / HNOI2017」单旋

    「AHOI / HNOI2017」单旋 题目链接 H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种 ...

随机推荐

  1. POJ3037 Skiing

    Skiing 题目大意: 给定一个M*N的网格,已知在每个网格中的点可以向上下左右四个方向移动一个单位,每个点都有一个高度值. 从每个点开始移动时存在一个速度值,从A点移动到B点,则此时B点的速度为& ...

  2. .net异步编程async和await的讨论收获

    微软官方描述: C# 5 引入了一种简便方法,即异步编程.此方法利用了 .NET Framework 4.5 及更高版本..NET Core 和 Windows 运行时中的异步支持. 编译器可执行开发 ...

  3. NYOJ-673悟空的难题~~水题~~

    悟空的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 自从悟空当上了齐天大圣,花果山上的猴子猴孙们便也可以尝到天上的各种仙果神酒,所以猴子猴孙们的体质也得到了很好的 ...

  4. nginx1.6.3

    Nginx1.6.3安装配置 安装时关闭防火墙和selinuxservice iptables stopsed -i "s/selinux=enabled/selinux=disable/g ...

  5. hdu 1059二进制优化背包问题

    #include<stdio.h> #include<string.h> int max(int a,int b ) {  return a>b?a:b; } int a ...

  6. Git学习之常见错误 git push 失败

    Git学习之常见错误 git push 失败 问题描述: git push Counting objects: , done. Delta compression using up to thread ...

  7. 洛谷—— P1785 漂亮的绝杀

    https://www.luogu.org/problem/show?pid=1785 题目背景 话说absi2011的企鹅在和斗神塔第60层的Boss战斗 不好,这局要输了,企鹅还剩4血了Boss还 ...

  8. [Bzoj3209]花神的数论题(数位dp)

    3209: 花神的数论题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2633  Solved: 1182[Submit][Status][Disc ...

  9. javax/servlet/ServletContext : Unsupported major.minor version 51.0

    原文:http://blog.csdn.net/mlin_123/article/details/50738532 解决:将版本从 3.1.0 改为 3.0.1 <!-- 添加servlet A ...

  10. JVM原理及内存溢出

    JVM原理及内存溢出