【ZJOI2017 Round2练习&BZOJ4827】D1T3 gift(FFT)
题意:
思路:可以看出题目所要最小化的是这样一个形式:
拆出每一项之后发现会变化的项只有sigma a[i]*b[i+t]与c^2,c*(a[i]-b[i])
c可以在外层枚举,剩下的只有sigma a[i]*b[i+t] (i=0..n-1)
因为FFT只能解决simga a[i]*b[n-i]
所以我们可以把a翻转,这样就化成了如上的形式
c[n+t+1]=a[n-i+1]*b[i+t] (i=0..n-1)
取出最小(大)的c[i],与外层枚举的c共同求出答案,取最小值
FFT模板,值得一背
type cp=record
x,y:extended;
end;
arr=array[..]of cp;
var c,d,cur:arr;
a,b:array[..]of longint;
n,i,m:longint;
ans,sum,s1,s2:int64; procedure swap(var x,y:cp);
var t:cp;
begin
t:=x; x:=y; y:=t;
end; function jia(a,b:cp;f:longint):cp;
begin
if f=- then
begin
b.x:=-b.x; b.y:=-b.y;
end;
jia.x:=a.x+b.x;
jia.y:=a.y+b.y;
end; function mult(a,b:cp):cp;
begin
mult.x:=a.x*b.x-a.y*b.y;
mult.y:=a.x*b.y+a.y*b.x;
end; function min(x,y:int64):int64;
begin
if x<y then exit(x);
exit(y);
end; function max(x,y:int64):int64;
begin
if x>y then exit(x);
exit(y);
end; procedure fft(var a:arr;n,f:longint);
var i,j,k,m:longint;
w,u,v:cp;
begin
i:=n>>; j:=;
while j<n do
begin
if i<j then swap(a[i],a[j]);
k:=n>>;
while k and i> do
begin
i:=i xor k;
k:=k>>;
end;
i:=i xor k;
inc(j);
end;
m:=;
while m<=n do
begin
w.x:=cos(*pi*f/m); w.y:=sin(*pi*f/m);
cur[].x:=; cur[].y:=;
for i:= to m- do cur[i]:=mult(cur[i-],w);
i:=;
while i<n do
begin
j:=i;
while j<i+(m>>) do
begin
u:=a[j]; v:=mult(a[j+(m>>)],cur[j-i]);
a[j]:=jia(u,v,);
a[j+(m>>)]:=jia(u,v,-);
inc(j);
end;
i:=i+m;
end;
m:=m<<;
end;
end; procedure solve;
var i,j,len:longint;
begin
for i:= to n- do c[i].x:=a[i];
for i:= to n- do d[i].x:=b[i];
i:=; j:=n-;
while i<=j do
begin
swap(d[i],d[j]);
inc(i); dec(j);
end;
len:=;
while len<=n+n do len:=len<<;
for i:=n to len- do
begin
c[i].x:=; d[i].x:=;
end;
for i:= to len- do
begin
c[i].y:=; d[i].y:=;
end;
fft(c,len,);
fft(d,len,);
for i:= to len- do c[i]:=mult(c[i],d[i]);
fft(c,len,-);
for i:= to len- do c[i].x:=trunc(c[i].x/len+0.5);
for i:=n to len- do c[i mod n].x:=c[i mod n].x+c[i].x;
sum:=-(<<);
for i:= to n- do sum:=max(sum,round(c[i].x));
sum:=-sum*;
end; begin
assign(input,'bzoj4827.in'); reset(input);
assign(output,'bzoj4827.out'); rewrite(output);
readln(n,m);
for i:= to n- do read(a[i]);
for i:= to n- do read(b[i]);
ans:=<<;
solve;
for i:= to n- do
begin
s1:=s1+a[i]-b[i];
s2:=s2+a[i]*a[i]+b[i]*b[i];
end;
for i:=-m to m do ans:=min(ans,int64(n)*i*i+*s1*i+s2+sum);
writeln(ans);
close(input);
close(output);
end.
【ZJOI2017 Round2练习&BZOJ4827】D1T3 gift(FFT)的更多相关文章
- BZOJ4827: [Hnoi2017]礼物(FFT 二次函数)
题意 题目链接 Sol 越来越菜了..裸的FFT写了1h.. 思路比较简单,直接把 \(\sum (x_i - y_i + c)^2\) 拆开 发现能提出一坨东西,然后与c有关的部分是关于C的二次函数 ...
- BZOJ4827:[HNOI2017]礼物(FFT)
Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一 个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在 ...
- 【ZJOI2017 Round2练习】
………………………………………………………………………… DAY1:听说是湖南的题 T1:spaly?毫无想法,写个暴力压压惊 T2:尼克杨问号脸 T3:FFT我不会啊,70points已经尽力了
- 【ZJOI2017 Round2练习&BZOJ4826】D1T2 sf(主席树,单调栈)
题意: 思路:From http://blog.csdn.net/neither_nor/article/details/70211150 对每个点i,单调栈求出左边和右边第一个大于i的位置,记为l[ ...
- 【BZOJ4827】【HNOI2017】礼物(FFT)
[BZOJ4827][HNOI2017]礼物(FFT) 题面 Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每 ...
- BZOJ4827 [Hnoi2017]礼物 多项式 FFT
原文链接http://www.cnblogs.com/zhouzhendong/p/8823962.html 题目传送门 - BZOJ4827 题意 有两个长为$n$的序列$x$和$y$,序列$x,y ...
- [BZOJ4827][Hnoi2017]礼物(FFT)
4827: [Hnoi2017]礼物 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1315 Solved: 915[Submit][Status] ...
- 【bzoj4827】[Hnoi2017]礼物 FFT
题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在她生日的前一天 ...
- [AHOI2017/HNOI2017][bzoj4827] 礼物 [FFT]
题面 传送门 思路 首先,有一个结论:两个手环增加非负整数亮度,等于其中一个增加一个整数亮度(可以为负) 我们令增加量为$x$,旋转以后的原数列为${a}{b}$那么现在的费用就是: $\sum_{i ...
随机推荐
- 【第三届强网杯】write up
一,鲲or鳗orGame 从浏览器里拿到game.gb 用 VisualBoyAdvance ,搜索内存变量,然后改变量就完事了,但是改变量他们说直接利用添加代码功能有bug,所以要在工具里的内存查看 ...
- 数据结构之单链表(C实现)
list.h #ifndef LIST_H #define LIST_H #include <iostream> #include <stdio.h> #include < ...
- [转]Linux系统调用--fcntl函数详解
功能描述:根据文件描述词来操作文件的特性. 文件控制函数 fcntl -- file control头文件: #include <unistd.h> #include & ...
- C#命名空间 using的用法
using的用法: 1. using指令:引入命名空间 这是最常见的用法,例如: using System; using Namespace1.SubNameSpace; 2. using stati ...
- 384 Shuffle an Array 打乱数组
打乱一个没有重复元素的数组.示例:// 以数字集合 1, 2 和 3 初始化数组.int[] nums = {1,2,3};Solution solution = new Solution(nums) ...
- 377 Combination Sum IV 组合之和 IV
Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...
- jQuery实现将div中滚动条滚动到指定位置的方法
1.JS代码: onload = function () { //初始化 scrollToLocation(); }; function scrollToLocation() { var mainCo ...
- SuperSocket学习笔记(一)-一个完整的例子
一.什么是SuperSocket 以下是作者的介绍 执行以下命令,获取SuperSocket项目 $ git clone https://github.com/kerryjiang/SuperSock ...
- 专题三:自定义Web服务器
前言: 经过前面的专题中对网络层协议和HTTP协议的简单介绍相信大家对网络中的协议有了大致的了解的, 本专题将针对HTTP协议定义一个Web服务器,我们平常浏览网页通过在浏览器中输入一个网址就可以看到 ...
- Maven之pom.xml详释
什么是pom? POM(Project Object Model):全称项目对象模型,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml.在Maven项目中,必须包含pom.xml文件 ...