标签:FFT

题目

题目传送门

题目描述

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

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

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

∑i=1n(xi−yi)2∑i=1n(xi−yi)2

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

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

输入输出格式

输入格式

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

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

输出格式

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

可以大于 m。

输入输出样例

输入样例#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≤500, m≤10;

70%的数据满足n≤5000;

100%的数据满足1≤n≤50000, 1≤m≤100, 1≤ai≤m。

题意

给定序列x,y,可以使x序列旋转或者整体增减,求

min∑i=1n(xi−yi)2min∑i=1n(xi−yi)2

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

分析

70分很好想到

先O(n^2)查找旋转的最优位置

然后O(n*m)查找最优的整体增减

那么复杂度瓶颈就在于查找旋转的最优位置

正解就开始推式子了

ans=min(∑i=1n(Xi+C−Y(i+p)%n)2)ans=min(∑i=1n(Xi+C−Y(i+p)%n)2)

ans =\min (\sum_{i=1}^n (X_i+C-Y_{(i+p)\%n})^2)

然后平方展开,得到

ans=min(∑i=1n−2XiY(i+p)%n+∑i=1n((Xi+C)2−2∗C∗Y(i+p)%n+Y2(i+p)%n))ans=min(∑i=1n−2XiY(i+p)%n+∑i=1n((Xi+C)2−2∗C∗Y(i+p)%n+Y(i+p)%n2))

ans=\min (\sum_{i=1}^n -2X_iY_{(i+p)\%n} + \sum_{i=1}^n ((X_i+C)^2-2*C*Y_{(i+p)\%n}+Y_{(i+p)\% n}^2))

对于前一个Σ求和,可以将x反转

∑i=1n−2Xn−i+1Y(i+p)%n∑i=1n−2Xn−i+1Y(i+p)%n

\sum_{i=1}^n -2X_{n-i+1}Y_{(i+p)\%n}

这个式子可以通过FFT求

后面的Σ求和,可以O(n*m)处理

code

70分暴力代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
#define mem(x,num) memset(x,num,sizeof x)
#define reg(x) for(int i=last[x];i;i=e[i].next)
#define inf 1e18
using namespace std;
inline ll read()
{ll f=1,x=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
const int maxn=1e5+6;
int n,m,x[maxn],y[maxn],pos;
ll sum,ans,Min=inf;
int main()
{n=read(),m=read();rep(i,1,n)x[i+n]=x[i]=read();rep(i,1,n)y[i+n]=y[i]=read();rep(i,1,n){sum=0;rep(j,i,i+n-1)sum+=(x[j]-y[j-i+1])*(x[j]-y[j-i+1]);if(sum<Min)Min=sum,pos=i;}ans=Min;rep(c,1,m){sum=0;rep(j,pos,pos+n-1)sum+=(x[j]+c-y[j-pos+1])*(x[j]+c-y[j-pos+1]);ans=min(sum,ans);sum=0;rep(j,pos,pos+n-1)sum+=(x[j]-y[j-pos+1]-c)*(x[j]-y[j-pos+1]-c);ans=min(sum,ans);}cout<<ans<<endl;return 0;
}

正解代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<complex>
#define rep(i,a,b) for(ll i=a;i<=b;i++)
#define dep(i,a,b) for(ll i=a;i>=b;i--)
#define ll long long
#define mem(x,num) memset(x,num,sizeof x)
#define reg(x) for(int i=last[x];i;i=e[i].next)
using namespace std;
inline ll read()
{ll f=1,x=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
typedef complex<double> E;
const int maxn=5e4+6;
double pi=acos(-1.0);
E A[maxn<<3],B[maxn<<3],c[maxn<<3];
double x[maxn<<3],y[maxn<<3];
ll ans1,ans2,sum1,sum2,ans,ans3;
int len,n,m,R[maxn<<3],lg;
void fft(E *a,int f){rep(i,0,len-1)if(i<R[i])swap(a[i],a[R[i]]);for(int i=1;i<len;i<<=1){E wn(cos(pi/i),f*sin(pi/i));for(int j=0;j<len;j+=(i<<1)){E w(1.0,0);for(int k=0;k<i;k++,w*=wn){E x=a[j+k],y=w*a[j+k+i];a[j+k]=x+y;a[j+k+i]=x-y;}}}
}
int main()
{n=read(),m=read();rep(i,1,n){scanf("%lf",&x[i]);ans1+=x[i]*x[i];sum1+=x[i];}rep(i,1,n){scanf("%lf",&y[i]);ans1+=y[i]*y[i];sum2+=y[i];y[i+n]=y[i];}rep(i,1,n)A[i]=x[n-i+1];rep(i,1,2*n)B[i]=y[i];len=1;while(len<4*n)len*=2,lg++;rep(i,0,len)R[i]=(R[i>>1]>>1)|((i&1)<<(lg-1));fft(A,1),fft(B,1);rep(i,0,len-1)c[i]=A[i]*B[i];fft(c,-1);ans=1e9;rep(i,-m,m){ans2=ans1;ans2+=2*i*sum1;ans2-=2*i*sum2;ans2+=n*i*i;rep(j,0,n-1){ans3=ans2;ans3-=2*(ll)(c[n+j+1].real()/len+0.5);ans=min(ans,ans3);}}printf("%lld\n",ans);
}

洛谷3723 [AH2017/HNOI2017]礼物相关推荐

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

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

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

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

  3. 洛谷P3722 [AH2017/HNOI2017]影魔

    题目背景 影魔,奈文摩尔,据说有着一个诗人的灵魂. 事实上,他吞噬的诗人灵魂早已成千上万. 千百年来,他收集了各式各样的灵魂,包括诗人. 牧师. 帝王. 乞丐. 奴隶. 罪人,当然,还有英雄. 题目描 ...

  4. (每日一题)P3723 [AH2017/HNOI2017]礼物(经典FFT)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.15 多项式 FFT Problem ...

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

    P3723 [AH2017/HNOI2017]礼物 式子化简 ∑i=1n(xi−yj)2\sum_{i = 1} ^{n} (x_i- y_j) ^2\\ i=1∑n​(xi​−yj​)2 我们对第一 ...

  6. P3723 [AH2017/HNOI2017]礼物 FFT + 式子化简

    传送门 文章目录 题意: 思路: 题意: 思路: 首先可以知道,我们对某个数组加上一个正数数的操作可以转换成对一个数组加上一个任意数,所以我们设变化量为xxx. 对于∑i=1n(ai−bi)2\sum ...

  7. AH2017/HNOI2017 礼物

    P3723 [AH2017/HNOI2017]礼物 题目大意 给两个数列 a a a和 b b b, a a a和 b b b中的数都小于等于 m m m, b b b可以首尾相接地旋转,要选择一个整 ...

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

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

  9. [AH2017/HNOI2017]礼物

    题意: 两个数列,每个数列都可以顺序旋转,也可以对所有数同时增加一个非负整数,现在问 的最小值 题解: 在求卷积前要将A数组倍长,B数组翻转 B数组翻转好理解,为什么A数组倍长,因为题目的数列是可以移 ...

最新文章

  1. CRM 客户端程序开发:获取表单界面上各种字段的值及其他属性
  2. console用法java_使用console对javaScirpt进行全面调试-全面分析console用法
  3. 【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能
  4. python 写 log
  5. Advice for students of machine learning--转
  6. 强行删除文件 windwos10_如何彻底删除 Windows 当中的顽固文件?
  7. mac java maven 设置
  8. android 生成推广图片保存_flutter 如何生成图片并保存到手机相册?
  9. Android中fragment之间和Activity的传值、切换
  10. easy excel根据行列excel_Excel函数如何根据地级市匹配所在省份计算快递费用
  11. 约瑟夫环问题(链表 + 公式)
  12. python何时用list,dict,set
  13. Android查看应用签名
  14. iOS开发者账户注册/添加调试设备
  15. cpu 调频 温度 ondemand
  16. 【教男朋友用python做计量】03.利用python进行假设检验(1)
  17. 关于idea的IdeaVim插件导致的光标问题(insert键)
  18. ABclonal再添一员“蛋白~DNA互作研究”大将—CUTTag
  19. Double值取得小数点后两位的若干方法
  20. 时间都哪去了--电视连续剧《老牛家的战争》插曲【视频】

热门文章

  1. 最全ctypes用法总结
  2. LNOI2019【12省联考】
  3. Druid密码加解密
  4. 大学计算机基础应用word,大学计算机基础(Word、Excel、PPT)复习题及答案
  5. 年会抽奖系统3d效果html,老板让我做年会抽奖系统,我用Excel制作内定抽到自己的大奖!...
  6. DDR SPD VDD 电压说明
  7. Docker(六)----Swarm搭建Docker集群
  8. linux循环管道之给外面,尴尬,一不小心把 Linux 管道给整漏了,
  9. java面试题及答案
  10. 百度搜索的网页点进去一片空白,刷新才可以