BZOJ4827: [Hnoi2017]礼物

4827: [Hnoi2017]礼物

Time Limit: 60 Sec  Memory Limit: 512 MB
Submit: 474  Solved: 334
[Submit][Status][Discuss]

Description

我的室友最近喜欢上了一个可爱的小女生。马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一

个送给她。每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度。但是在她生日的前一天,我的室友突

然发现他好像拿错了一个手环,而且已经没时间去更换它了!他只能使用一种特殊的方法,将其中一个手环中所有

装饰物的亮度增加一个相同的自然数 c(即非负整数)。并且由于这个手环是一个圆,可以以任意的角度旋转它,

但是由于上面 装饰物的方向是固定的,所以手环不能翻转。需要在经过亮度改造和旋转之后,使得两个手环的差

异值最小。在将两个手环旋转且装饰物对齐了之后,从对齐的某个位置开始逆时针方向对装饰物编号 1,2,…,n,

其中 n 为每个手环的装饰物个数,第 1 个手环的 i 号位置装饰物亮度为 xi,第 2 个手 环的 i 号位置装饰物

亮度为 yi,两个手环之间的差异值为(参见输入输出样例和样例解释): $\sum_{i=1}^{n}(x_i-y_i)^2$麻烦你帮他

计算一下,进行调整(亮度改造和旋转),使得两个手环之间的差异值最小, 这个最小值是多少呢?

Input

输入数据的第一行有两个数n, m,代表每条手环的装饰物的数量为n,每个装饰物的初始 亮度小于等于m。

接下来两行,每行各有n个数,分别代表第一条手环和第二条手环上从某个位置开始逆时 针方向上各装饰物的亮度。

1≤n≤50000, 1≤m≤100, 1≤ai≤m

Output

输出一个数,表示两个手环能产生的最小差异值。

注意在将手环改造之后,装饰物的亮度 可以大于 m。

Sample Input

5 6
1 2 3 4 5
6 3 3 4 5

Sample Output

1
【样例解释】
需要将第一个手环的亮度增加1,第一个手环的亮度变为: 2 3 4 5 6 旋转一下第二个手环。对于该样例,是将第
二个手环的亮度6 3 3 4 5向左循环移动 2017-04-15 第 6 页,共 6 页 一个位置,使得第二手环的最终的亮度为
:3 3 4 5 6。 此时两个手环的亮度差异值为1。

思路{

  啊啊啊,我竟然一A $HNOI2017day1 T3$ .....

  $Ans=min(\sum_{i=1}^{n}(x_i-y_i+c))$

  最后发现根据二次函数的知识可以确定$c$的取值,关键是旋转操作.

  确定$c$后发现式子只取决于$\sum_{i=1}^{n}(x_i*y_i)$

  把$x$数组断环为链,再翻转一下,就是一个卷积的形式了....

  所以直接上$FFT$就可以了.

  细节有点多,我过了样例就没管了...哈哈哈

}

#include<bits/stdc++.h>
#define il inline
#define RG register
#define ll long long
#define db double
#define N 1000000
using namespace std;
typedef complex<db>W;
const db pi=acos(-1);
W a[N],b[N];
int rev[N],L,n;
ll sumx1,sumx2,sumy1,sumy2;
void FFT(W * A,int f){
  for(int i=0;i<n;++i)if(i<rev[i])swap(A[i],A[rev[i]]);
  for(int i=1;i<n;i<<=1){
    W wn(cos(pi/i),sin(f*pi/i)),x,y;
    for(int j=0;j<n;j+=(i<<1)){
      W w(1,0);
      for(int k=0;k<i;k++,w*=wn){
    x=A[j+k],y=w*A[j+k+i];
    A[j+k]=x+y;
    A[j+k+i]=x-y;
      }
    }
  }
}
ll Ans,len;
ll f(int x){return len*x*x+2*x*(sumx1-sumy1);}
ll min(ll a,ll b,ll c){return min(min(a,b),c);}
void pre(){
  Ans=sumx2+sumy2;
  ll flag=abs(sumx1-sumy1);
  ll x=-(sumx1-sumy1)/n;
  if(flag%n)Ans+=min(f(x+1),f(x),f(x-1));
  else Ans+=f(x);
}
int main(){
  int c;
  scanf("%d%d",&n,&c);len=n;int m=n*2-1;n--;
  for(int i=0;i<=n;++i){
    int x;scanf("%d",&x);a[i]=a[i+n+1]=x;
    sumx1+=x;
    sumx2+=x*x;
  }reverse(a,a+m+1);
  for(int i=0;i<=n;++i){
    int x;scanf("%d",&x);b[i]=x;
    sumy1+=x;
    sumy2+=x*x;
  }pre();m*=2;
  for(n=1;n<=m;n<<=1)L++;
  for(int i=0;i<=n;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));
  FFT(a,1),FFT(b,1);
  for(int i=0;i<n;++i)a[i]*=b[i];
  FFT(a,-1);
  ll tmp(0);
  for(int i=len;i<=m;++i)
    tmp=max(tmp,(ll)(a[i].real()/n+0.5));
  cout<<Ans-2*tmp;
  return 0;
}
时间: 2024-11-01 23:24:10

BZOJ4827: [Hnoi2017]礼物的相关文章

[bzoj4827][Hnoi2017]礼物_FFT

礼物 bzoj-4827 Hnoi-2017 题目大意:给定两个长度为$n$的手环,第一个手环上的$n$个权值为$x_i$,第二个为$y_i$.现在我可以同时将所有的$x_i$同时加上自然数$c$.我也可以将第一个手环任意旋转.旋转后每一个$x$对应一个$y$,那么代价为$\sum\limits_{i=0}^{n-1} (x_i-y_i)^2$.求最小代价. 注释:$1\le n\le 10^5$,$0\le maxval \le 100$. 想法: 水题啊..... 推推式子,我们假设就加了$

BZOJ4827 [Hnoi2017]礼物 多项式 FFT

原文链接http://www.cnblogs.com/zhouzhendong/p/8823962.html 题目传送门 - BZOJ4827 题意 有两个长为$n$的序列$x$和$y$,序列$x,y$的第$i$项分别是$x_i,y_i$. 选择一个序列$A$,现在你可以对它进行如下两种操作: $1.$ 得到一个和$A$循环同构的序列$A'$. $2.$ 给所有的$A'_i$都加上$c(c\in N^+)$,得到序列$A''$. 你进行上面两个操作之后,得到的序列分别为$x'',y''$(注意$

【bzoj4827】[Hnoi2017]礼物 FFT

题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在她生日的前一天,我的室友突 然发现他好像拿错了一个手环,而且已经没时间去更换它了!他只能使用一种特殊的方法,将其中一个手环中所有 装饰物的亮度增加一个相同的自然数 c(即非负整数).并且由于这个手环是一个圆,可以以任意的角度旋转它, 但是由于上面 装饰物的方向是固定的,所以手环不能翻转.需要在经过亮度改造和旋转

BZOJ4827:[AH2017/HNOI2017]礼物——题解

https://www.lydsy.com/JudgeOnline/problem.php?id=4827 https://www.luogu.org/problemnew/show/P3723 题面见原题. 参考了洛谷一些题解. 先推式子,x数组为a,y数组为b,将b数组倍长后有: 因为c的范围在[-m,m]之间,而m=100,且稍加思考后发现k在1,3,4项中是无用的,所以通过枚举c取得1,3,4项和的最小值. 考虑计算第二项,其实是卷积型,实际上将a数组前移并倒转即可得到: 变成了卷积,F

HNOI2017礼物

礼物 这估计是最水,最无脑的一道题了 首先发现总和最接近时答案最小 发现答案就是\((\sum_{i=1}^{n}a[i]^2+b[i]^2)-2*max(\sum_{i=1}^{n}a[i]*b[i+j])(0<=j<=n-1)\) 前面随便算,主要是后面那个式子,其实就是两个数列错位相乘加起来最大值 把\(b\)反过来就变成\(\sum_{i=1}^{n}a[i]*b[n-i-j])(0<=j<=n-1)\),直接就多项式卷积,FFT一算就行了. // luogu-judger

[HNOI2017]礼物

题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度. 但是在她生日的前一天,我的室友突然发现他好像拿错了一个手环,而且已经没时间去更换它了!他只能使用一种特殊的方法,将其中一个手环中所有装饰物的亮度增加一个相同的自然数 c(即非负整数).并且由于这个手环是一个圆,可以以任意的角度旋转它,但是由于上面装饰物的方向是固定的,所以手环不能翻转.需要在经过亮度改造和旋转之后,使得

bzoj 4827: [HNOI2017]礼物 (FFT)

一道FFT 然而据说暴力可以水70分 然而我省选的时候看到了直接吓傻了  连暴力都没打 太弱了啊QAQ emmmm 详细的拆开就看其他题解吧233 最后那一步卷积其实我一直没明白 后来画画图终于懂了 只要把其中一个反过来 多项式乘法的结果中的每一项系数就对应某一个Σx[i] * y[j] 的结果 前面几项是不完全的结果 但是太小了就被忽略啦 代码如下 /************************************************************** Problem:

[BZOJ 4827][Hnoi2017]礼物(FFT)

Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在她生日的前一天,我的室友突 然发现他好像拿错了一个手环,而且已经没时间去更换它了!他只能使用一种特殊的方法,将其中一个手环中所有 装饰物的亮度增加一个相同的自然数 c(即非负整数).并且由于这个手环是一个圆,可以以任意的角度旋转它, 但是由于上面 装饰物的方向是固定的,所以手环不能翻转.需要在经过

[AH/HNOI2017]礼物

题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度. 但是在她生日的前一天,我的室友突然发现他好像拿错了一个手环,而且已经没时间去更换它了!他只能使用一种特殊的方法,将其中一个手环中所有装饰物的亮度增加一个相同的自然数 c(即非负整数).并且由于这个手环是一个圆,可以以任意的角度旋转它,但是由于上面装饰物的方向是固定的,所以手环不能翻转.需要在经过亮度改造和旋转之后,使得