[HNOI2017]礼物
Description:
给定两个有n个数的序列,你可以将其中一个进行旋转(想象是在一个环上),或者对序列的每个数加上一个非负整数C
求操作后 \(\sum{(a_i-b_i)^2}\)的最小值
Description:
\(n<=5*10^4,m<=100,a_i<=m\)
Solution:
一眼看去,十分不可做,于是开始拆式子
\(\sum(a_i-b_i+C)^2\)
\(=\sum a_i^2 +\sum b_i^2+2*\sum (a_i-b_i)*C +n*C^2-2*\sum a_ib_i\)
由于 \(m\) 很小,我们考虑枚举 C
然后只要求出 \(2*\sum a_ib_i\) 的最大值就行了
将 b 数组翻转
即求 $ \sum a_ib_{n-i+1}$ 最大值
如何求 ?
将 a 数组倍长
由卷积的定义,FFT后对于 n+1 到 2*n 得到的数就分别对应所有的旋转
checkmax 即可
#include<bits/stdc++.h>
using namespace std;
const int mxn=1e6+5;
const double PI=acos(-1);
int n,m,l,s1,s2,s3,lim=1,r[mxn],tp[mxn];
int ans,res=100000000;
struct cp {
	double x,y;
	cp(double xx=0,double yy=0) {x=xx,y=yy;}
	friend cp operator + (cp a,cp b) {
		return cp(a.x+b.x,a.y+b.y);
	}
	friend cp operator - (cp a,cp b) {
		return cp(a.x-b.x,a.y-b.y);
	}
	friend cp operator * (cp a,cp b) {
		return cp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
	}
}a[mxn],b[mxn];
void FFT(cp *p,int opt)
{
	for(int i=0;i<=lim;++i)
		if(i<r[i]) swap(p[i],p[r[i]]);
	for(int mid=1;mid<lim;mid<<=1) {
		cp wn(cos(PI/mid),opt*sin(PI/mid));
		for(int len=mid<<1,j=0;j<lim;j+=len) {
			cp w(1,0);
			for(int k=0;k<mid;++k,w=w*wn) {
				cp x=p[j+k],y=w*p[j+mid+k];
				p[j+k]=x+y,p[j+mid+k]=x-y;
			}
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i) {
		scanf("%lf",&a[i].x);
		a[i+n].x=a[i].x;
		ans+=a[i].x*a[i].x;
		s1+=a[i].x;
	}
	for(int i=1;i<=n;++i) {
		scanf("%d",&tp[i]);
		ans+=tp[i]*tp[i];
		s2+=tp[i];
	}
	for(int i=1;i<=n;++i) {
		b[i].x=tp[n-i+1];
	}
	while(lim<=3*n) lim<<=1,++l;
	for(int i=0;i<lim;++i)
		r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
	FFT(a,1); FFT(b,1);
	for(int i=0;i<=lim;++i) a[i]=a[i]*b[i];
	FFT(a,-1);
	for(int i=n+1;i<=n*2;++i) s3=max(s3,(int )(a[i].x/lim+0.5));
	ans-=2*s3;
	for(int i=-m;i<=m;++i) res=min(res,n*i*i+2*(s1-s2)*i);
	printf("%d",res+ans);
	return 0;
}
[HNOI2017]礼物的更多相关文章
- bzoj 4827: [Hnoi2017]礼物 [fft]
		4827: [Hnoi2017]礼物 题意:略 以前做的了 化一化式子就是一个卷积和一些常数项 我记着确定调整值还要求一下导... #include <iostream> #include ... 
- P3723 [AH2017/HNOI2017]礼物
		题目链接:[AH2017/HNOI2017]礼物 题意: 两个环x, y 长度都为n k可取 0 ~ n - 1 c可取任意值 求 ∑ ( x[i] - y[(i + k) % n + 1] ... 
- 【BZOJ4827】 [Hnoi2017]礼物
		BZOJ4827 [Hnoi2017]礼物 Solution 如果一串数的增加,不就等于另一串数减吗? 那么我们可以把答案写成另一个形式: \(ans=\sum_{i=1}^n(x_i-y_i+C)^ ... 
- 4827: [Hnoi2017]礼物
		4827: [Hnoi2017]礼物 链接 分析: 求最小的$\sum_{i=1}^{n}(x_i-y_i)^2$ 设旋转了j位,每一位加上了c. $\sum\limits_{i=1}^{n}(x_{ ... 
- 【LG3723】[AHOI2017/HNOI2017]礼物
		[LG3723][AHOI2017/HNOI2017]礼物 题面 洛谷 题解 首先我们将\(c\)看作一个可以为负的整数,那么我们就可以省去讨论在哪个手环加\(c\)的繁琐步骤了 设我们当前已经选好了 ... 
- 洛谷 P3723 [AH2017/HNOI2017]礼物 解题报告
		P3723 [AH2017/HNOI2017]礼物 题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个 ... 
- [BZOJ4827][Hnoi2017]礼物(FFT)
		4827: [Hnoi2017]礼物 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1315 Solved: 915[Submit][Status] ... 
- [Luogu P3723] [AH2017/HNOI2017]礼物  (FFT 卷积)
		题面 传送门:洛咕 Solution 调得我头大,我好菜啊 好吧,我们来颓柿子吧: 我们可以只旋转其中一个手环.对于亮度的问题,因为可以在两个串上增加亮度,我们也可以看做是可以为负数的. 所以说,我们 ... 
- 笔记-[AH2017/HNOI2017]礼物
		笔记-[AH2017/HNOI2017]礼物 [AH2017/HNOI2017]礼物 \[\begin{split} ans_i=&\sum_{j=1}^n(a_j-b_j+i)^2\\ =& ... 
- [bzoj4827][Hnoi2017]礼物_FFT
		礼物 bzoj-4827 Hnoi-2017 题目大意:给定两个长度为$n$的手环,第一个手环上的$n$个权值为$x_i$,第二个为$y_i$.现在我可以同时将所有的$x_i$同时加上自然数$c$.我 ... 
随机推荐
- 优先选择nullptr而不是0和NULL
			我们知道:0是一个int,而不是一个指针.如果C++在一个只有指针才能够使用的上下文中发现它只有一个0,那么它会勉强将0解释成空指针,但那时一种倒退行为.C++的主要方针是0就是一个int,而不是指针 ... 
- Centos7上实现不同网段的服务器文件共享
			目的:实现不同网段的服务器实现文件共享 前提:服务器1可以和共享服务器互通,共享服务器和服务器2互通 拓扑如下: 思路: 一般文件共享有涉及windown系统的用samba,纯类centos系统就用n ... 
- 20165206 预备作业3 Linux安装及学习
			Linux的安装与学习 - 在自己笔记本上安装Linux操作系统 在安装虚拟机的过程中遇到了不少问题,但也都进行了尝试并得到了解决.首先是在安装VirtulBox的安装上,按照老师给的链接下载安装,不 ... 
- net core 使用 rabbitmq
			windows环境安装: https://www.cnblogs.com/ericli-ericli/p/5902270.html .NET Core 使用RabbitMQ https://www.c ... 
- JQuery调用WCF服务
			一:创建一个wcf服务项目 [ServiceContract] public interface IService1 { [OperationContract] [WebInvoke(RequestF ... 
- Can't connect to X11 window server using 的问题,求解
			在JVM中加入-Djava.awt.headless=true对于tomcat ,可以修改catalina.sh,加入:CATALINA_OPTS="$CATALINA_OPTS -Djav ... 
- ynoi2018
			题解: 全分块是啥操作啊.. 而且都好难.. 1.未来日记 这个比较简单 对每个块开个线段树维护权值 $n\sqrt{n}logn$ 这个会炸空间 并不能做... 但还是说一下做法 首先考虑分块 然后 ... 
- 第二种掌握的排序Q-Q
			#include<stdio.h> int main() { int s[10000]={0}; int i=0,j=0,n=0,x=0; scanf(" ... 
- tomcat优化,java查看
			java堆空间分为 新生代 ,老年代 , 持久代 各自有各自的垃圾回收算法 eden区:新生的对象存放在这经常被回收 from .to 存活区 在老年代,回收的频率不是很高 jdk8 就没有持久 ... 
- springmvc 无法访问静态资源
			没有配置<mvc:resources location="/" mapping="/**"/> <?xml version="1.0 ... 
