题目描述
Tukkun带着他的合唱队去环形音乐厅参加演出。上场前,Tukkun发现了严重的问题:音乐厅的工作人员把他们的合唱队形搞错了。
具体来说,Tukkun的合唱队有N个人围成一圈,身高按照顺时针顺序记为a[0],a[1],...,a[n-1]。音乐厅的工作人员则以为他们的身高是b[0],b[1],...,b[n-1]。
Tukkun只剩最后一点点时间了。由于舞台是环形的,在保证相对位置不变的前提下,Tukkun可以让他的队员循环移动若干个身位。
另外,考虑到Tukkun带的队伍里都是小朋友,音乐厅可以将整个舞台整体抬高若干厘米,视为所有队员身高增加同样的数值。提高的高度只能为整数厘米。
以上两种操作可以进行任意次。

Tukkun的目标是让新的队形看起来像工作人员安排的队形。
对于每个位置,定义这个位置的得分为身高偏差值的平方。这个偏差值就是这个位置上站的队员身高与工作人员安排身高的差值。
你的目标当然是让所有位置的得分之和最低了。

输入
第一行是两个数n,表示合唱队的人数。
第二行n个数a[i],表示Tukkun的合唱队员身高。
第三行n个数b[i],表示工作人员以为的合唱队员身高。
输出
一行,最低得分。

样例输入
5
120 130 140 150 160
180 180 200 180 180
样例输出
520
样例解释
首先循环移动2个身位,使得队形变为140 150 160 120 130。
之后将舞台垫高44厘米,最终队形为184 194 204 164 174。
每个位置的分数是16 196 16 256 36,总和520。

数据范围
20%:n<=200
40%:n<=3000
100%:n<=40000,所有身高值<=200

思路:将式子化开,化简可得

要求最小值为f-2*g

其中 f(c)=Σ(a[i]^2+b[i]^2+2*c*(a[i]-b[i])+c^2),g(s)=Σ(b[i]*a[(i+s)%n])

因为调整身高不会超过200,因此,f可以枚举得到最值,而g是一个卷积形式,我们用2*n和n的数组求卷积,最终得到的3n数组中间n个数字都是合法方案,在这之间选一个最小的即可。

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<complex>
#define ll long long
typedef std::complex<double> cd;
const double PI=acos(-);
ll suma,sumb,sqra,sqrb,A[],B[],a[],b[],c[];
int n,lc,pos;
long long calc(int h){
return (ll)sqra+sqrb+n*h*h+*suma*h-*sumb*h;
}
long long F(){
long long res=1000000000000LL;
for (int i=;i<=;i++){
res=std::min(res,calc(i));
}
return res;
}
int bitrev(int t,int n){
int res=;
for (int i=;i<n;i++) res|=(t>>(n-i-)&)<<i;
return res;
}
void fft(cd *a,int n,int rev){
int len=<<n;
static cd y[];
for (int i=;i<len;i++) y[i]=a[bitrev(i,n)];
for (int d=;d<len;d<<=){
cd wn(exp(cd(,PI*rev/d)));
for (int k=;k<len;k+=d*){
cd w(,);
for (int i=k;i<k+d;i++,w*=wn){
cd u=y[i],v=y[i+d]*w;
y[i]=u+v;
y[i+d]=u-v;
}
}
}
if (rev==-)
for (int i=;i<len;i++) y[i]/=len;
for (int i=;i<len;i++) a[i]=y[i];
}
void mul(ll *a,int la,ll *b,int lb,ll *c,int &lc){
int n=,len=;
static cd t1[],t2[];
for (;len<la*||len<lb*;len<<=,n++);
for (int i=;i<la;i++) t1[i]=cd(a[i],);
for (int i=;i<lb;i++) t2[i]=cd(b[i],);
for (int i=la;i<len;i++) t1[i]=cd(,);
for (int i=lb;i<len;i++) t2[i]=cd(,);
fft(t1,n,);fft(t2,n,);
for (int i=;i<len;i++) t1[i]*=t2[i];
fft(t1,n,-);
lc=len;
for (int i=;i<len;i++) c[i]=(ll)(t1[i].real()+0.5);
}
long long G(){
for (int i=;i<n;i++) A[i]=A[i+n]=a[n-i-];
for (int i=;i<n;i++) B[i]=b[i];
mul(A,*n,B,n,c,lc);
long long res=;
for (int i=n;i<*n;i++)
res=std::max(res,c[i]);
return res;
}
int main(){
scanf("%d",&n);
for (int i=;i<n;i++) scanf("%lld",&a[i]);
for (int i=;i<n;i++) suma+=a[i],sqra+=a[i]*a[i];
for (int i=;i<n;i++) scanf("%lld",&b[i]);
for (int i=;i<n;i++) sumb+=b[i],sqrb+=b[i]*b[i];
long long ans=F();
ans-=*G();
printf("%lld\n",ans);
}

伪造队形(FFT)的更多相关文章

  1. Web安全相关(二):跨站请求伪造(CSRF/XSRF)

    简介 CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对 ...

  2. 并行计算提升32K*32K点(32位浮点数) FFT计算速度(4核八线程E3处理器)

    对32K*32K的随机数矩阵进行FFT变换,数的格式是32位浮点数.将产生的数据存放在堆上,对每一行数据进行N=32K的FFT,记录32K次fft的时间. 比较串行for循环和并行for循环的运行时间 ...

  3. 【BZOJ-2179&2194】FFT快速傅里叶&快速傅里叶之二 FFT

    2179: FFT快速傅立叶 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2978  Solved: 1523[Submit][Status][Di ...

  4. django表单验证和跨站伪造csrf

    Form验证 django中的Form一般有两种功能: 输入html 验证用户输入 django使用内置form方法验证表单提交的数据 html页面 <!DOCTYPE html> < ...

  5. 为什么FFT时域补0后,经FFT变换就是频域进行内插?

    应该这样来理解这个问题: 补0后的DFT(FFT是DFT的快速算法),实际上公式并没变,变化的只是频域项(如:补0前FFT计算得到的是m*2*pi/M处的频域值, 而补0后得到的是n*2*pi/N处的 ...

  6. 防御CSRF的方法有哪些(一) HTTP 头中自定义属性并验证 CSRF跨站域请求伪造攻击

    CSRF (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下 ...

  7. FFT NNT

    算算劳资已经多久没学新算法了,又要重新开始学辣.直接扔板子,跑...话说FFT算法导论里讲的真不错,去看下就懂了. //FFT#include <cstdio> #include < ...

  8. CC countari & 分块+FFT

    题意: 求一个序列中顺序的长度为3的等差数列. SOL: 对于这种计数问题都是用个数的卷积来进行统计.然而对于这个题有顺序的限制,不好直接统计,于是竟然可以分块?惊为天人... 考虑分块以后的序列: ...

  9. ECF R9(632E) & FFT

    Description: 上一篇blog. Solution: 同样我们可以用fft来做...就像上次写的那道3-idoit一样,对a做k次卷积就好了. 同样有许多需要注意的地方:我们只是判断可行性, ...

随机推荐

  1. 疯狂delphi - 朱建强 (一些小例子很实用,也是我所关心的几个问题)

    疯狂delphi - 朱建强 (一些小例子很实用,也是我所关心的几个问题) Android实例-获取安卓手机WIFI信息(XE8+小米2)http://www.cnblogs.com/FKdelphi ...

  2. hdu3308--LCIS 最大连续递增序列长度

    这个是动态的,所以要用线段树维护.代码里有注释因为ls敲成lsum,rs敲成rsum查错查了好久.. #include <set> #include <map> #includ ...

  3. PHP中文汉字验证码

    hb.ttf换成随便你自己下载的ttf Header("Content-type: image/PNG"); $str="的一是在了不和有大这主中人上为们地个用工时要动国 ...

  4. Hadoop 1、在虚拟机上进行 HDFS 安装

    一.准备条件 1.四台Linux虚拟机(1台NameNode节点,1台Secondary节点(Secondary和其中1台DataNode共用),外加2台DataNode) 2.下载Hadoop版本, ...

  5. MyBatis配置解析

    MyBatis配置文件解析(概要) 1.configuration:根元素 1.1 properties:定义配置外在化 1.2 settings:一些全局性的配置 1.3 typeAliases:为 ...

  6. [小技巧] 把虚拟机中的Linux系统安装到U盘中

    出于各种需求,很多用户可能经常会在Windows系统中安装虚拟机,然后在虚拟机中安装Linux系统.使用虚拟机的优点是可以同时使用多个系统,而缺点也是显然的,也就是程序运行效率较差.   而实际上,L ...

  7. compareTo简介

    compareTo()方法是用来比较字符串大小,该方法用来判断一个字符串是大于,等于还是小于另一个字符串.判断字符串大小的依据是根据他们在字典中的顺序决定的 语法 Str1.compareTo(Str ...

  8. Picasso – Android系统的图片下载和缓存类库

    Picasso – Android系统的图片下载和缓存类库 Picasso 是Square开源的一个用于Android系统下载和缓存图片的项目.该项目和其他一些下载图片项目的主要区别之一是:使用4.0 ...

  9. 常见HTTP状态码的含义

    200 请求已成功,请求所希望的响应头或数据体将随此响应返回. 301 被请求的资源已永久移动到新位置. 302 请求的资源现在临时从不同的 URI 响应请求. 400 1.语义有误,当前请求无法被服 ...

  10. 静态方法中不能new内部类的实体对象

    原因如下: 1.内部类可以访问外部类的成员变量 2.对象创建完成后对象的成员变量才会被分配空间 3.main的静态方法执行时可以不存在外部类,不创建实体对象 4.内部类能访问成员变量意味着一定存在外部 ...