伪造队形(FFT)
题目描述
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)的更多相关文章
- Web安全相关(二):跨站请求伪造(CSRF/XSRF)
简介 CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对 ...
- 并行计算提升32K*32K点(32位浮点数) FFT计算速度(4核八线程E3处理器)
对32K*32K的随机数矩阵进行FFT变换,数的格式是32位浮点数.将产生的数据存放在堆上,对每一行数据进行N=32K的FFT,记录32K次fft的时间. 比较串行for循环和并行for循环的运行时间 ...
- 【BZOJ-2179&2194】FFT快速傅里叶&快速傅里叶之二 FFT
2179: FFT快速傅立叶 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2978 Solved: 1523[Submit][Status][Di ...
- django表单验证和跨站伪造csrf
Form验证 django中的Form一般有两种功能: 输入html 验证用户输入 django使用内置form方法验证表单提交的数据 html页面 <!DOCTYPE html> < ...
- 为什么FFT时域补0后,经FFT变换就是频域进行内插?
应该这样来理解这个问题: 补0后的DFT(FFT是DFT的快速算法),实际上公式并没变,变化的只是频域项(如:补0前FFT计算得到的是m*2*pi/M处的频域值, 而补0后得到的是n*2*pi/N处的 ...
- 防御CSRF的方法有哪些(一) HTTP 头中自定义属性并验证 CSRF跨站域请求伪造攻击
CSRF (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下 ...
- FFT NNT
算算劳资已经多久没学新算法了,又要重新开始学辣.直接扔板子,跑...话说FFT算法导论里讲的真不错,去看下就懂了. //FFT#include <cstdio> #include < ...
- CC countari & 分块+FFT
题意: 求一个序列中顺序的长度为3的等差数列. SOL: 对于这种计数问题都是用个数的卷积来进行统计.然而对于这个题有顺序的限制,不好直接统计,于是竟然可以分块?惊为天人... 考虑分块以后的序列: ...
- ECF R9(632E) & FFT
Description: 上一篇blog. Solution: 同样我们可以用fft来做...就像上次写的那道3-idoit一样,对a做k次卷积就好了. 同样有许多需要注意的地方:我们只是判断可行性, ...
随机推荐
- C51的模块化设计方法
一个大的单片机程序往往包含很多模块,我是这样组织的: 1.每一个C源文件都要建立一个与之名字一样的H文件(头文件),里面仅仅包括该C文件的函数的声明,其他的什么也不会有,比如变量的定义啊等等不应该有. ...
- windows设备驱动安装指南
高观点下的设备驱动安装(overview) 一.windows是怎样安装设备的? 第一步:新设备的识别 在给一个新设备安装驱动之前,总线或集线器(hub)驱动会为连接到PC上的设备分配一个硬件ID(h ...
- 程序错误[C/C++]
对于初学者而言,一般意义上,程序错误可以分为两类,逻辑错误和非逻辑错误.前者是指,程序可以通过编译或链接但运行时不符合预期结果,后者是程序不能通过编译或链接. 乍一看这样的分类非常清楚.不过,当引入语 ...
- Erlang ODBC 处理中文
erlang处理utf8字符集相对比较简单,因为它是用integer的list来保存所有的string的,所以处理什么字符集都没关系. 话虽这么说,但我在使用erlang的ODBC处理中文时,着实费了 ...
- 关于bootstrap--表格(table的各种样式)
1.table-striped:斑马线表格 2.table-bordered:带边框的表格 3.table-hover:鼠标悬停高亮的表格 4.table-condensed:紧凑型表格(单元格的内距 ...
- Beyond Compare 忽略两个文件内容的顺序比较文件内容(xjl456852原创)
有时两个文件内容的顺序是不固定的,对比时需要忽略文件顺序进行对比. 可以这样设置: 点击菜单下面工具栏按钮: 点击Format旁的三角,选择Sorted,就会按文件的顺序排序比较.忽略了文件内容顺序的 ...
- html li标签前面添加图标三种方法
今天无聊写下这个例子,希望对初学者有帮助,代码如下 <!DOCTYPE html> <html> <head> <meta charset="utf ...
- php中对MYSQL操作之批量运行,与获取批量结果
<?php //批量运行,与获取结果 //创建一个mysqli对象 $mysqli = new MySQLi("主机名","mysqlusername". ...
- C#调用Java代码
c#直接调用java代码,需要ikvmbin-0.44.0.5.zip.下载地址: http://pan.baidu.com/share/link?shareid=3996679697&uk= ...
- (转)Ajax的原理和应用
1.ajax技术的背景 不可否认,ajax技术的流行得益于google的大力推广,正是由于google earth.google suggest以及gmail等对ajax技术的广泛应用,催生了ajax ...