[AH/HNOI2017]礼物

题目描述

我的室友最近喜欢上了一个可爱的小女生。马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她。每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度。

但是在她生日的前一天,我的室友突然发现他好像拿错了一个手环,而且已经没时间去更换它了!他只能使用一种特殊的方法,将其中一个手环中所有装饰物的亮度增加一个相同的自然数 c(即非负整数)。并且由于这个手环是一个圆,可以以任意的角度旋转它,但是由于上面装饰物的方向是固定的,所以手环不能翻转。需要在经过亮度改造和旋转之后,使得两个手环的差异值最小。

在将两个手环旋转且装饰物对齐了之后,从对齐的某个位置开始逆时针方向对装饰物编号1,2,…,n,其中 n 为每个手环的装饰物个数, 第 1 个手环的 i 号位置装饰物亮度为 xi,第 2 个手环的 i 号位置装饰物亮度为 yi,两个手环之间的差异值为(参见输入输出样例和样例解释):

\sum_{i=1}^{n} (x_i-y_i)^2∑?i=1?n??(x?i???y?i??)?2??

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

输入输出格式

输入格式:

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

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

输出格式:

输出一个数,表示两个手环能产生的最小差异值。注意在将手环改造之后,装饰物的亮度

可以大于 m。

输入输出样例

输入样例#1:

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

输出样例#1:

1

说明

【样例解释】

需要将第一个手环的亮度增加1,第一个手环的亮度变为: 2 3 4 5 6

旋转一下第二个手环。对于该样例,是将第二个手环的亮度6 3 3 4 5向左循环移动一个位置,使得第二手环的最终的亮度为: 3 3 4 5 6。

此时两个手环的亮度差异值为1

【数据范围】

30%的数据满足n≤500, m≤10;

70%的数据满足n≤5000;

100%的数据满足1≤n≤50000, 1≤m≤100, 1≤ai≤m。

ans=∑(xi+c-y(i+p)%n)2

=∑(xi+c)^2-2xiy(i+p)%n-2*c*y(i+p)%n+y(i+p)%n^2

=∑-2xiy(i+p)%n+∑(xi+c)^2-2*c*y(i+p)%n+y(i+p)%n^2

 

∑-2xiy(i+p)%n=∑-2xiyi+p

反转x得

∑-2xn-i+1yi+p   对于每个p就是,结果就是第n+p+1项

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<cmath>
  6 using namespace std;
  7 double pi=acos(-1.0);
  8 const int N=50005;
  9 struct Complex
 10 {
 11     double r,i;
 12     Complex(double r=0,double i=0):r(r),i(i) {};
 13     Complex operator+(const Complex &x)
 14     {
 15         return Complex(r+x.r,i+x.i);
 16     }
 17     Complex operator-(const Complex &x)
 18     {
 19         return Complex(r-x.r,i-x.i);
 20     }
 21     Complex operator*(const Complex &x)
 22     {
 23         return Complex(r*x.r-i*x.i,i*x.r+r*x.i);
 24     }
 25 }A[8*N],B[8*N],C[8*N];
 26 int ans1,ans,ans2,ansx,ansy;
 27 int n,m,p[50001],q[100001],len;
 28 void rader(Complex F[],int len)
 29 {int i;
 30     int j=len/2;
 31     for (i=1;i<len-1;i++)
 32     {
 33         if (i<j)swap(F[i],F[j]);
 34          int k=len/2;
 35          while (j>=k)
 36          {
 37             j-=k;
 38             k/=2;
 39          }
 40          if (j<k) j+=k;
 41     }
 42 }
 43 void FFT(Complex F[],int len,int t)
 44 {int i,j,k;
 45     rader(F,len);
 46     for (i=2;i<=len;i=i*2)
 47     {
 48         Complex wn;
 49         wn.r=cos(t*2*pi/i);wn.i=sin(t*2*pi/i);
 50         for (j=0;j<len;j+=i)
 51         {
 52             Complex E;
 53             E.r=1;E.i=0;
 54              for (k=j;k<j+i/2;k++)
 55               {
 56                     Complex u=F[k];
 57                     Complex v=E*F[k+i/2];
 58                 F[k]=u+v;
 59                 F[k+i/2]=u-v;
 60                 E=E*wn;
 61               }
 62         }
 63     }
 64     if (t==-1)
 65      for (i=0;i<len;i++)
 66       F[i].r/=len;
 67 }
 68 int main()
 69 {int i,j;
 70     cin>>n>>m;
 71     for (i=1;i<=n;i++)
 72     {
 73         scanf("%d",&p[i]);
 74     }
 75     for (i=1;i<=n;i++)
 76     {
 77         scanf("%d",&q[i]);
 78         q[n+i]=q[i];
 79     }
 80     for (i=1;i<=n;i++)
 81     ans1=ans1+p[i]*p[i]+q[i]*q[i];
 82      len=1;
 83       while (len<4*n) len*=2;
 84       for (i=1;i<=n;i++)
 85        A[i-1].r=p[n-i+1];
 86       for (i=1;i<=2*n;i++)
 87        B[i-1].r=q[i-1];
 88       FFT(A,len,1);FFT(B,len,1);
 89       for (i=0;i<len;i++)
 90        C[i]=A[i]*B[i];
 91        FFT(C,len,-1);
 92
 93       for (i=0;i<=n-1;i++)
 94       {
 95         ans2=max(ans2,(int)(C[i+n+1].r+0.5));
 96         ansx+=p[i+1];
 97         ansy+=q[i+1];
 98       }
 99       ans=2e9;
100       for (i=-m;i<=m;i++)
101       {
102         int ans3=ans1-2*ans2;
103         ans=min(ans,ans3+2*i*ansx-2*i*ansy+n*i*i);
104         //cout<<i<<‘ ‘<<ans<<endl;
105       }
106     cout<<ans;
107 }
时间: 2024-10-10 17:58:07

[AH/HNOI2017]礼物的相关文章

BZOJ4827: [Hnoi2017]礼物

4827: [Hnoi2017]礼物 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 474  Solved: 334[Submit][Status][Discuss] Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在她生日的前一天,我的室友突 然发现他好像拿错了一个手环,而且已经没时间去更换它了

[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$. 想法: 水题啊..... 推推式子,我们假设就加了$

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]大佬

题目描述 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你作为一个 OIER,面对这样的事情非常不开心,于是发表了对大佬不敬的言论. 大佬便对你开始了报复,你也不示弱,扬言要打倒大佬. 现在给你讲解一下什么是大佬,大佬除了是神犇以外,还有着强大的自信心,自信程度可以被量化为一个正整数 C( 1<=C<=10^8), 想要打倒一个大佬的唯一方法是摧毁 Ta 的自信心,也就是让大佬的自信值等于 0(恰好等

BZOJ 4827 [Hnoi2017]礼物 ——FFT

题目上要求一个循环卷积的最小值,直接破环成链然后FFT就可以了. 然后考虑计算的式子,可以分成两个部分分开计算. 前半部分FFT,后半部分扫一遍. #include <map> #include <ctime> #include <cmath> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <alg

【bzoj4827】[Hnoi2017]礼物 FFT

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