Description

Solution

设y[i+k]=y[i]+n。

由于我们要最优解,则假如将x[i]和y[σ[i]]连线的话,线是一定不会交叉的。

所以,$ans=\sum (x_{i}-y_{i+s}+c)^{2}$

拆开得$ans=\sum (x_{i}^{2}+y_{i+s}^{2}+c^{2}-2x_{i}y_{i+s}+2x_{i}c-2y_{i+s}c)$

其中,$x_{i}y_{i+s}$是卷积形式。

我们把经过处理的y数组reverse一下,和x数组进行卷积(这里用ntt似乎会爆常数,fft大法好)。然后针对不同的s,得到以c为未知数的所有常数或系数,ans就是一个二次函数了。c用公式解就可以。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const double pi=acos(-);
struct C
{
double r,i;
friend C operator+(C a,C b){return C{a.r+b.r,a.i+b.i};}
friend C operator*(C a,C b){return C{a.r*b.r-a.i*b.i,a.i*b.r+a.r*b.i};}
friend C operator-(C a,C b){return C{a.r-b.r,a.i-b.i};}
}fx[],fy[];
int rev[];
void fft(C *num,int n,int dft)
{
for (int i=;i<n;i++)
if (i<rev[i]) swap(num[i],num[rev[i]]);
for (int step=;step<n;step<<=)
{
C wn{cos(pi/step),sin(pi/step)*dft};
for (int j=;j<n;j+=step*)//从0开始!
{
C w{,};
for (int k=;k<step;k++,w=w*wn)
{
C x=num[j+k],y=w*num[j+k+step];
num[j+k]=x+y;
num[j+k+step]=x-y;
}
}
}
if (dft==-) for (int i=;i<n;i++) num[i].r/=n;
}
int T,n,k,len,L;
int x[],y[];
ll sumx[],sumy[],sumx2[],sumy2[];
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&k);
memset(sumx,,sizeof(sumx));
memset(sumy,,sizeof(sumy));
memset(sumx2,,sizeof(sumx2));
memset(sumy2,,sizeof(sumy2));
memset(fx,,sizeof(fx));memset(fy,,sizeof(fy));
for (int i=;i<=k;i++)
{
scanf("%d",&x[i]);
sumx[i]=sumx[i-]+x[i],sumx2[i]=sumx2[i-]+1ll*x[i]*x[i];
}
for (int i=;i<=k;i++)
{scanf("%d",&y[i]);y[k+i]=y[i]+n;}
for (int i=;i<=*k;i++)
sumy[i]=sumy[i-]+y[i],sumy2[i]=sumy2[i-]+1ll*y[i]*y[i]; for (int i=;i<=k;i++) fx[i-].r=x[i];
for (int i=,j=*k;j;i++,j--) fy[i].r=y[j];
len=,L=;
for (;len<*k;len<<=,L++);
L++;len<<=;
for (int i=;i<len;i++) rev[i]=(rev[i>>]>>)|(i&)<<(L-);
fft(fx,len,);fft(fy,len,);
for (int i=;i<len;i++) fx[i]=fx[i]*fy[i];
fft(fx,len,-);
ll re,c,b,ans=1e13;
for (int i=*k-,j=;i>=k;i--,j++)
{
re=fx[i].r+0.2;
re=-*re+sumx2[k]+sumy2[j+k]-sumy2[j];
b=*(sumx[k]-sumy[j+k]+sumy[j]);
c=-b/(*k);
ans=min(ans,k*c*c+c*b+re);
c++;
ans=min(ans,k*c*c+c*b+re);
}
cout<<ans<<endl;
}
}

[2016北京集训试题15]项链-[FFT]的更多相关文章

  1. [2016北京集训试题15]cot-[分块]

    Description Solution 如图,假如我们知道了以任何一个点为顶点的135-180度的前缀和和90-180度的前缀和,我们就可以搞出三角形的面积. 差分.add[i][j]和dev[i] ...

  2. [2016北京集训试题14]股神小D-[LCT]

    Description Solution 将(u,v,l,r)换为(1,u,v,l)和(2,u,v,r).进行排序(第4个数为第一关键字,第1个数为第二关键字).用LCT维护联通块的合并和断开.(维护 ...

  3. [2016北京集训试题6]mushroom-[bitset]

    Description Solution bitset是个好东西啊..强行压位什么的真是够orz. 由于所有的蘑菇上房间的长相是一样的,我们针对每个房间,算出它到根节点的bitset和以它为根的子树的 ...

  4. [2016北京集训试题6]网络战争-[最小割树(网络流)+kd-tree+倍增]

    Description A 联邦国有 N 个州,每个州内部都有一个网络系统,有若干条网络线路,连接各个 州内部的城市. 由于 A 国的州与州之间的关系不是太好,每个州都只有首府建立了到别的州的网络.具 ...

  5. [2016北京集训试题6]魔法游戏-[博弈论-sg函数]

    Description Solution 首先,每个节点上的权值可以等价于该节点上有(它的权的二进制位数+1)个石子,每次可以拿若干个石子但不能不拿. 然后就发现这和NIM游戏很像,就计算sg函数em ...

  6. [2016北京集训试题8]连在一起的幻想乡[dp+无向图计数]

    Description Solution 本博客参考yww大佬的博客,为了加深理解我就自己再写一遍啦. 以下的“无向图”均无重边无自环. 定义f0[n]为n个点构成的无向图个数,f1[n]为n个点构成 ...

  7. [2016北京集训试题7]thr-[树形dp+树链剖分+启发式合并]

    Description Solution 神仙操作orz. 首先看数据范围,显然不可能是O(n2)的.(即绝对不是枚举那么简单的),我们考虑dp. 定义f(x,k)为以x为根的子树中与x距离为k的节点 ...

  8. (2016北京集训十)【xsy1528】azelso - 概率期望dp

    北京集训的题都是好题啊~~(于是我爆0了) 注意到一个重要的性质就是期望是线性的,也就是说每一段的期望步数可以直接加起来,那么dp求出每一段的期望就行了... 设$f_i$表示从$i$出发不回到$i$ ...

  9. (2016北京集训十)【xsy1529】小Q与进位制 - 分治FFT

    题意很简单,就是求这个数... 其实场上我想出了分治fft的正解...然而不会打...然后打了个暴力fft挂了... 没啥好讲的,这题很恶心,卡常卡精度还爆int,要各种优化,有些dalao写的很复杂 ...

随机推荐

  1. Oracle EBS 报错 您不具有分配给您的清除MDS的权限

  2. linux下postgresql的安装与卸载

    安装: sudo apt-get update sudo apt-get install postgresql 启动: sudo /etc/init.d/postgresql start 查看是否启动 ...

  3. 用标签页TitleSwitch切换不通的控制器

    用标签页TitleSwitch切换不通的控制器 教程效果: 项目开发中效果: 各种源码: TitleSwitch.h 与 TitleSwitch.m (这个是修改过的升级版本) // // Title ...

  4. LA 3938 动态最大连续区间 线段树

    思路很清晰,实现很繁琐.分析过程可以参考LRJ,自己的总结晚些放. #include <cstdio> #include <cstring> #include <algo ...

  5. 线段树&&线段树的创建线段树的查询&&单节点更新&&区间更新

    目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...

  6. IO多路复用(select)

    select在操作系统内部,维护了一个for循环,检测对象是否变化.select在各种平台都可使用,但效率不高.select对监听的个数是有限制的(1024) poll与select相同,但是没有监听 ...

  7. Oracle 关于WKT构造SDO_GEOMETRY的问题。

    由于系统前端使用OpenLayers框架,后台数据库使用oracle spatial.大家知道Oracle spatial的SDO_GEOMETRY十分复杂,如果使用期java api ,那就坑爹了, ...

  8. window7远程桌面到server不能复制粘贴解决的方法

    用远程桌面登陆server不能在本机和远程server之间粘贴文本了,即不能从本机复制文本粘贴到server,也不能从server复制文本粘贴到本机. 下面是解决方法之中的一个,试了几次都非常管用户: ...

  9. 打造自己的移动绿色版 Python 环境

    本文只适用 Windows 系统,Linux,Mac 或其他系统可以直接自己写个脚本安装就好了,甚至大部分系统自带. 相信某些人写好了Python程序结果给朋友运行又得装个Python环境,难免失去了 ...

  10. 【bzoj 3622】已经没有什么好害怕的了

    题目 看到这个数据范围就发现我们需要一个\(O(n^2)\)的做法了,那大概率是\(dp\)了 看到恰好\(k\)个我们就知道这基本是个容斥了 首先解方程发现我们需要使得\(a>b\)的恰好有\ ...