[2016北京集训试题15]项链-[FFT]
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]的更多相关文章
- [2016北京集训试题15]cot-[分块]
Description Solution 如图,假如我们知道了以任何一个点为顶点的135-180度的前缀和和90-180度的前缀和,我们就可以搞出三角形的面积. 差分.add[i][j]和dev[i] ...
- [2016北京集训试题14]股神小D-[LCT]
Description Solution 将(u,v,l,r)换为(1,u,v,l)和(2,u,v,r).进行排序(第4个数为第一关键字,第1个数为第二关键字).用LCT维护联通块的合并和断开.(维护 ...
- [2016北京集训试题6]mushroom-[bitset]
Description Solution bitset是个好东西啊..强行压位什么的真是够orz. 由于所有的蘑菇上房间的长相是一样的,我们针对每个房间,算出它到根节点的bitset和以它为根的子树的 ...
- [2016北京集训试题6]网络战争-[最小割树(网络流)+kd-tree+倍增]
Description A 联邦国有 N 个州,每个州内部都有一个网络系统,有若干条网络线路,连接各个 州内部的城市. 由于 A 国的州与州之间的关系不是太好,每个州都只有首府建立了到别的州的网络.具 ...
- [2016北京集训试题6]魔法游戏-[博弈论-sg函数]
Description Solution 首先,每个节点上的权值可以等价于该节点上有(它的权的二进制位数+1)个石子,每次可以拿若干个石子但不能不拿. 然后就发现这和NIM游戏很像,就计算sg函数em ...
- [2016北京集训试题8]连在一起的幻想乡[dp+无向图计数]
Description Solution 本博客参考yww大佬的博客,为了加深理解我就自己再写一遍啦. 以下的“无向图”均无重边无自环. 定义f0[n]为n个点构成的无向图个数,f1[n]为n个点构成 ...
- [2016北京集训试题7]thr-[树形dp+树链剖分+启发式合并]
Description Solution 神仙操作orz. 首先看数据范围,显然不可能是O(n2)的.(即绝对不是枚举那么简单的),我们考虑dp. 定义f(x,k)为以x为根的子树中与x距离为k的节点 ...
- (2016北京集训十)【xsy1528】azelso - 概率期望dp
北京集训的题都是好题啊~~(于是我爆0了) 注意到一个重要的性质就是期望是线性的,也就是说每一段的期望步数可以直接加起来,那么dp求出每一段的期望就行了... 设$f_i$表示从$i$出发不回到$i$ ...
- (2016北京集训十)【xsy1529】小Q与进位制 - 分治FFT
题意很简单,就是求这个数... 其实场上我想出了分治fft的正解...然而不会打...然后打了个暴力fft挂了... 没啥好讲的,这题很恶心,卡常卡精度还爆int,要各种优化,有些dalao写的很复杂 ...
随机推荐
- Grunt-学习。
Grunt 依赖 Node.js 所以在安装之前确保你安装了 Node.js.然后开始安装 Grunt 实际上,安装的并不是 Grunt,而是 Grunt-cli,也就是命令行的 Grunt,这样你就 ...
- 1.Junit test使用
1.导入maven依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</arti ...
- Struts-config.xml配置文件《action-mappings》元素的详解
原文地址:http://blog.163.com/sara1124@126/blog/static/11291097020105125537114/ action-mappings 该元素用于将Act ...
- oracle 28001错误 密码过期失效
背景 服务器演示地址,无法使用.排查原因,是数据库密码有问题,报28001错误 问题 确定是oracle密码机制,180失效了 解决 1.进入sqlplus模式 sqlplus / as sysdba ...
- Js 运算符(加减乘除)
1.加法 + +NaN //NaN,有一个为NaN就为NaN var box=Infinity+Infinity //Infinity var box=-Infinity + -Infinity // ...
- DOM操作案例之--全选与反选
全选与反选在表单类的项目中还是很常见的,电商项目中的购物车一定少不了这个功能. 下面我只就用一个简单的案例做个演示吧. <div class="wrap"> <t ...
- MySQL 更改数据库数据存储目录
MySQL数据库默认的数据库文件位于 /var/lib/mysql 下,有时候由于存储规划等原因,需要更改 MySQL 数据库的数据存储目录. 下文总结整理了实践过程的操作步骤. 1 确认MySQ ...
- Windows启动控制台登录模式
效果如下: 实现代码: Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Lo ...
- mongodb的学习-6-命令简单使用
1.创建数据库 use DATABASE_NAME 举例说明: > use another //创建了数据库another switched to db another > db anot ...
- Java 中 Emoji 的正则表达式
一.emoji 的范围 查阅维基百科中 emoji 的说明 1. 杂项符号及图形 杂项符号及图形一共有768个字符,范围为: U+1F300 - U+1F5FF,在 Java 中正则表达式为: &qu ...