P3723 [AH2017/HNOI2017]礼物

题目描述

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

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

在将两个手环旋转且装饰物对齐了之后,从对齐的某个位置开始逆时针方向对装饰物编号\(1,2,\dots,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\)。

说明

\(30\%\)的数据满足\(n\le500,m\le10\);

\(70\%\)的数据满足\(n\le5000\);

\(100\%\)的数据满足\(1\le n\le50000\), \(1\le m\le100\), \(1\le a_i\le m\)。


假设搞在\(x\)上,然后

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

\[=\sum x_i+\sum y_i+2c\sum x_i-y_i+nc^2-2\sum x_iy_i
\]

发现可以让\(c\)是负的然后搞在一个东西上,然后前面是二次函数可以直接搞。

注意取整数要讨论。

然后最大化后面的,考虑把它化成多项式相乘的形式,大概可以把一个数组倍长,另一个数组取反之类的。

其实方法不唯一,手玩一下就好了,然后我用了一种比较蠢的。


Code:

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4. #define ll long long
  5. const int N=(1<<18)+10;
  6. using std::max;
  7. using std::min;
  8. struct complex
  9. {
  10. double x,y;
  11. complex(){}
  12. complex(double x,double y){this->x=x,this->y=y;}
  13. complex friend operator +(complex n1,complex n2){return complex(n1.x+n2.x,n1.y+n2.y);}
  14. complex friend operator -(complex n1,complex n2){return complex(n1.x-n2.x,n1.y-n2.y);}
  15. complex friend operator *(complex n1,complex n2){return complex(n1.x*n2.x-n1.y*n2.y,n1.x*n2.y+n1.y*n2.x);}
  16. }a[N],b[N],tmpx,tmpy,w,wn;
  17. int n,m,turn[N],x[N],y[N],A,B,len=1,L=-1;
  18. ll sum=0x7fffffffffffffffll;
  19. const double pi=3.1415926535897;
  20. void FFT(complex *a,int typ)
  21. {
  22. for(int i=0;i<len;i++)
  23. if(i<turn[i])
  24. std::swap(a[i],a[turn[i]]);
  25. for(int le=1;le<len;le<<=1)
  26. {
  27. wn=complex(cos(pi/le),typ*sin(pi/le));
  28. for(int p=0;p<len;p+=le<<1)
  29. {
  30. w=complex(1,0);
  31. for(int i=p;i<p+le;i++,w=w*wn)
  32. {
  33. tmpx=a[i],tmpy=w*a[i+le];
  34. a[i]=tmpx+tmpy;
  35. a[i+le]=tmpx-tmpy;
  36. }
  37. }
  38. }
  39. }
  40. void chkmin(int c){sum=min(sum,1ll*A+2*c*B+n*c*c);}
  41. int main()
  42. {
  43. scanf("%d%d",&n,&m);
  44. for(int i=1;i<=n;i++) scanf("%d",x+i),B+=x[i],A+=x[i]*x[i];
  45. for(int i=1;i<=n;i++) scanf("%d",y+i),B-=y[i],A+=y[i]*y[i];
  46. int c=-B/n;
  47. chkmin(c);chkmin(c+1);chkmin(c-1);
  48. for(int i=1;i<=n;i++)
  49. {
  50. a[i]=complex(x[i],0),b[i]=complex(y[n+1-i],0);
  51. a[i+n]=a[i],b[i+n]=b[i];
  52. }
  53. m=n<<1;
  54. while(len<=m<<1) len<<=1,++L;
  55. for(int i=0;i<len;i++) turn[i]=turn[i>>1]>>1|(i&1)<<L;
  56. FFT(a,1),FFT(b,1);
  57. for(int i=0;i<len;i++) a[i]=a[i]*b[i];
  58. FFT(a,-1);
  59. ll mx=0;
  60. for(int i=n+1;i<=m;i++)
  61. mx=max(mx,(ll)(a[i].x/len+0.5)-(ll)(a[i-n].x/len+0.5));
  62. mx=mx*2;
  63. printf("%lld\n",1ll*sum-mx);
  64. return 0;
  65. }

2018.12.3

洛谷 P3723 [AH2017/HNOI2017]礼物 解题报告的更多相关文章

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

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

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

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

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

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

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

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

  5. P3723 [AH2017/HNOI2017]礼物

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

  6. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  7. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  8. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  9. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

随机推荐

  1. 【转】CentOS Linux解决Device eth0 does not seem to be present(linux)

    原文来自:http://www.linuxidc.com/Linux/2012-12/76248.htm 在VMware里克隆出来的CentOS Linux.. ifconfig...没有看到eth0 ...

  2. docker制作自己的镜像并上传dockerhub

    1.首先注册自己的dockerhub账号,注册地址:https://hub.docker.com 2.在linux服务器登录自己的账号:docker login --username=qiaoyeye ...

  3. meta标签的常见用法

    一.定义和用法 <meta> 标签始终位于 head 元素中.<meta> 元素可提供有关页面的元信息(meta-information),元数据不会显示在页面上,但是对于机器 ...

  4. 第四篇 Postman之Pre-request Script(前置处理器:JS之 YYYY-MM-DD HH:MM:SS)

    本篇来讲讲Pre-request Script 前置处理器,定义在发送request之前需要运行的一些脚本,应用场景主要是设置全局变量和环境变量. 本例子也是项目中遇到的,需要修改与客户的预约时间,但 ...

  5. 用Python深入理解跳跃表原理及实现

    最近看 Redis 的实现原理,其中讲到 Redis 中的有序数据结构是通过跳跃表来进行实现的.第一次听说跳跃表的概念,感到比较新奇,所以查了不少资料.其中,网上有部分文章是按照如下方式描述跳跃表的: ...

  6. vue2.0做移动端开发用到的相关插件和经验总结1.0

    最近在用vue2.0做微信公众号相关的前端开发,经过这次开发实践,现将项目中用到的相关比较实用的插件及遇到的相关问题进行整理,希望和大家共同交流...... cssrem:一个CSS值转REM的VSC ...

  7. linux中匹配正确的ip地址

    1.假设IP地址是规范的,没有出错误的 sed -n "/[0-9]\{1,3\}.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p" test ...

  8. 2017年4月8日Office 365 使用CSV文件导入邮件组

    国内版 第一步: Import-Module msonline Connect-MsolService 输入用户名密码 第二步: Get-MsolUser" 第三步: Set-Executi ...

  9. 数据库与数据仓库的比较Hbase——Hive

    数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented).集成的(Integrate).相对稳定的(Non-Volatile).反映历史变化(Time Varian ...

  10. 王者荣耀交流协会Beta发布文案美工展示博客

    logo: 我们的logo是蓝底白字,非常简洁大气的设计感,上面印有我们的软件名称,更好的直观的彰显了我们的主题.我们的软件就是要迎合使用者,给使用者更加方便快捷的工作体验,更好的衡量自己的时间分配. ...