伪造队形(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次卷积就好了. 同样有许多需要注意的地方:我们只是判断可行性, ...
随机推荐
- hdu 2818 Building Block (带权并查集,很优美的题目)
Problem Description John are playing with blocks. There are N blocks ( <= N <= ) numbered ...N ...
- fcntl函数加文件锁
对文件加锁是原子性的,可以用于进程间文件操作的同步.在linux下,有三个函数可以对文件进程加锁,分别是fcntl.flock.lockf.这里只说fcntl,它的用法也是最复杂的. fcntl是fi ...
- PHP设计模式笔记三:三种基本设计模式(工厂模式、单例模式、注册树模式) -- Rango韩老师 http://www.imooc.com/learn/236
一.工厂设计模式 index.php $db = IMooc\Factory::createDatabase(); 使用工厂类的静态方法直接创建一个dababase对象,当类名发生修改时,在工厂里修改 ...
- spring Scurity终于测试OK了,复杂的功能还待深入研究!发布出来一起探讨吧!
spring Scurity终于测试OK了,复杂的功能还待深入研究!发布出来一起探讨吧! 就是因 为研究它,我的个天啦!头都大了一圈!还待修改完整版!我的目标不是每个项目拿到它就能使用!到时再说啦.. ...
- Qt使用QGraphicsView实现滑动窗体效果
QGraphicsView用来显示一个滚动视图区的QGraphicsScene内容.QGraphicsScene提供了QGraphicsItem的容器功能.通常与QGraphicsView一起使用来描 ...
- linux提取指定行至指定位置
grep查找ERROR,定位位置 awk打印到指定行数 sed打印到文本末尾 awk打印到文本末尾 方法一 #!/bin/csh -f if(-f errorlog.rpt) then rm -rf ...
- 用JS的for循环打印九九乘法表
需要使用两个for循环嵌套,代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- gstreamer让playbin能够播放rtp over udp流数据
最近一段时间在研究传屏低延迟传输相关的一些东西.本来想使用gstreamer来验证下rtp over udp传送h264 nal数据相关 的,结果发现竟然不能用playbin来播放rtp的数据!诚然, ...
- [转载]C#开源项目(国外的还是很多)
C#开源项目(国外的还是很多)一.Ajax框架Ajax.NET Professional (AjaxPro)是最先把AJAX技术在微软.NET环境下的实现的AJAX框架之一.它在客户端脚本之上创建代理 ...
- (一)Activity参数传递
1.主Activity,用于启动另一个Activity()public class MainActivity extends Activity { @Override protected void o ...