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. windows zend_guard+apache no ssl+php no Thread Safe fastcgi模式 环境配置

    最近公司要做代码加密,就采用ZEND GUARD 方式加密代码 并进行显示 此文为总结,以备自己以后查看和给需要的同学们参考 采用的php为5.3版本  由于现在加密的更改, 能支持zend guar ...

  2. Vue2学习笔记:实例

    1.实例 <!DOCTYPE html> <html> <head> <title></title> <script src=&quo ...

  3. Oracle案例12——NBU Oracle恢复

    最近在做NBU ORACLE备份的恢复测试,执行恢复时报错ORA-27211: Failed to load Media Management Library,具体处理过程如下:一.错误信息 执行命令 ...

  4. CentOS服务器的加固方案

    >>>Centos账户安全 对Centos的加固首先要控制用户的权限,用户权限主要涉及到/etc下的/passwd,/shadow和/group三个文件 /passwd文件主要是存储 ...

  5. November 20th 2016 Week 47th Sunday

    Learn from yesterday, live for today, look to tomorrow. 学习昨天,活在今天,展望明天. There is always room at the ...

  6. 【Alpha】Daily Scrum Meeting——blog2

    团队成员 吴吉键 201421122007(组长) 魏修祺 201421122008 孙劲林 201421122022 1. 会议当天照片 忘记拍了!(没有拍照片的习惯,没有第四人拍照) 2. 每个人 ...

  7. vue项目用nodejs实现模拟数据方法

    1)在项目根目录(如demo)中创建一个文件夹,如base,将项目中所有的前端文件全部放到base文件夹中,此时项目demo下只有一个文件夹base 2)通过cmd进入命令窗口,直接执行npm ins ...

  8. python第七课——循环结构 while

    while循环: 2.1.有四要素组成: ①.初始化条件(执行一次)一个起始数据/起点,一般使用变量来进行存储 ②.循环条件(可能执行多次)循环合适结束全靠它,执行结果为True,那么循环继续,反之, ...

  9. using指令都用了这么多年了,其实还真没懂!

    在C语言中,我们经常使用#include<stdio.h>指令来导入标准输入输出库,这确实很好理解,相当于把代码复制到当前的程序中. 但在C#语言中,当我们写Console程序时,经常在第 ...

  10. PHPExcel 导入

    首先: //包含excel的类库require APPPATH . 'third_party/PHPExcel.php';require APPPATH . 'third_party/PHPExcel ...