伪造队形(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次卷积就好了. 同样有许多需要注意的地方:我们只是判断可行性, ...
随机推荐
- 这样就算会了PHP么?-2
学些关于函数FUNCTION方面的东东.. 感觉和PYTHON的APLLY功能差不多.. <?php function come(){ echo "来啦<p>"; ...
- Codeforces 22B Bargaining Table
http://www.codeforces.com/problemset/problem/22/B 题意:求出n*m的方格图中全是0的矩阵的最大周长 思路:枚举 #include<cstdio& ...
- PCB正片和负片有什么区别
概念:正片和负片是底片的两种不同类型. 正片:简单地说就是,在底片上看到什么就有什么. 负片:正好相反,看到的就是没有的,看不到的就是有的.见下图: 在 Allegro中使用正负片的特点: 正片:优点 ...
- zoj2314 经典 无源汇有上下界最大流 并输出可行流
ZOJ Problem Set - 2314 Reactor Cooling Time Limit: 5 Seconds Memory Limit: 32768 KB Specia ...
- struct2(六) 为表单添加验证
简介 为表单添加验证 添加校验的方法: 1. first name 不能为null 2. Email address 不能为null 3. age 必须大于18岁 为了在用户提交的时候,能够校验这个表 ...
- 关于我们-EIBOA易博男装-互联网品质男装品牌-在线销售男士西服,衬衫,外套,西裤,领带|全场免运费,30天退换货保障
关于我们 - 网站底部 | ELLE中国 | ELLE China 关于赫斯特国际集团 男人尚--专注男人时尚 关于男人尚 这些数据,你知道吗? 1.全国至少1亿男人的衬衫尺码错误: 2.57%的男人 ...
- 为什么Nginx的性能要比Apache高很多?
为什么Nginx的性能要比Apache高很多? 这得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的sele ...
- WPF与输入法冲突研究之二:汉字输入法会导致WPF程序的崩溃!
如果是输入非汉字的数据信息,可以添加一下内容: xmlns:input="clr-namespace:System.Windows.Input;assembly=PresentationCo ...
- Ruby中,类方法和实例方法的一个有趣的例子
最初的代码如下: class Object def abc p "instance abc" end def self.abc p "class abc" en ...
- mysql判断某个字符串是否包含另一个
like SELECT * FROM wx_webauth_userinfo where city LIKE "%台%";"; 结果: 函数find_in_set(str ...