[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。

pre.cjk { font-family: "Droid Sans Fallback", monospace }
p { margin-bottom: 0.25cm; line-height: 120% }

题目可以转化为求Σ(xi-yi+d)^2的最小值.yi可以转n下.
把这个式子展开,Σxi^2+Σyi^2+n*d^2-Σ2xi*yi+Σxi*d+Σyi*d.可以发现,x,y的二次项为常量,和d有关的项为一个二次函数,剩下的就是Σxi*yi.
这个东西有n个不同的值,分别就是第二个数组转n下.可以把第二个数组翻转,然后就构造出了卷积,FFT后提取系数即可.
用complex时取real()然后取整要加0.5.
 1 #include<set>
 2 #include<map>
 3 #include<queue>
 4 #include<stack>
 5 #include<ctime>
 6 #include<cmath>
 7 #include<string>
 8 #include<vector>
 9 #include<cstdio>
10 #include<cstdlib>
11 #include<cstring>
12 #include<iostream>
13 #include<algorithm>
14 #include<complex>
15 #define LL long long
16 #define maxn 50000*4
17 using namespace std;
18 const double pi=acos(-1);
19 typedef complex<double> C;
20 C A[maxn],B[maxn];
21 int R[maxn],L=0,n,nn,m;
22 LL sumx=0,sumy=0,pfx=0,pfy=0;
23 void FFT(C *k,int f){
24   for(int i=0;i<n;i++) if(i<R[i]) swap(k[i],k[R[i]]);
25   for(int i=1;i<n;i<<=1){
26     C wn(cos(pi/i),f*sin(pi/i));
27     for(int j=0;j<n;j+=(i<<1)){
28       C w(1,0);
29       for(int p=0;p<i;p++,w*=wn){
30     C x=k[j+p],y=w*k[j+p+i];
31     k[j+p]=x+y;k[j+p+i]=x-y;
32       }
33     }
34   }
35   if(f==-1) for(int i=0;i<n;i++) k[i]/=n;
36 }
37 LL jis(LL x){return nn*x*x+2*(sumx-sumy)*x;}
38 void solve(){
39   LL x1=(sumy-sumx)/nn;
40   LL x2=x1+1,x3=x1-1;
41   LL zx=min(jis(x1),min(jis(x2),jis(x3)));
42   LL zd=-999999;
43   for(int i=0;i<nn-1;i++)
44     zd=max(zd,(LL)(A[i].real()+0.5+A[i+nn].real()));
45   zd=max(zd,(LL)(A[nn-1].real()));
46   printf("%lld",pfx+pfy+zx-2*zd);
47 }
48 int main()
49 {
50   int x;
51   scanf("%d%d",&n,&m),nn=n;
52   n--;m=2*n;
53   for(int i=0;i<=n;i++) scanf("%d",&x),A[i]=x,sumx+=x,pfx+=x*x;
54   for(int i=n;i>=0;i--) scanf("%d",&x),B[i]=x,sumy+=x,pfy+=x*x;
55   for(n=1;n<=m;n<<=1) L++;
56   for(int i=0;i<n;i++) R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));
57   FFT(A,1);FFT(B,1);
58   for(int i=0;i<n;i++) A[i]*=B[i];
59   FFT(A,-1);
60   solve();
61   return 0;
62 } 
时间: 2024-11-10 01:02:41

[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

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(即非负整数).并且由于这个手环是一个圆,可以以任意的角度旋转它,但是由于上面装饰物的方向是固定的,所以手环不能翻转.需要在经过亮度改造和旋转之后,使得

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(即非负整数).并且由于这个手环是一个圆,可以以任意的角度旋转它, 但是由于上面 装饰物的方向是固定的,所以手环不能翻转.需要在经过亮度改造和旋转

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''$(注意$