[NOIP2021] 方差

链接

鉴于 luogu 经常似,这里把 Markdown 粘过来了

题目

[NOIP2021] 方差

题目描述

给定长度为 n 的非严格递增正整数数列 1a1a2an。每次可以进行的操作是:任意选择一个正整数 1<i<n,将 ai 变为 ai1+ai+1ai。求在若干次操作之后,该数列的方差最小值是多少。请输出最小值乘以 n2 的结果。

其中方差的定义为:数列中每个数与平均值的差的平方的平均值。更形式化地说,方差的定义为 D=1ni=1n(aia¯)2,其中 a¯=1ni=1nai

输入格式

输入的第一行包含一个正整数 n,保证 n104

输入的第二行有 n 个正整数,其中第 i 个数字表示 ai 的值。数据保证 1a1a2an

输出格式

输出仅一行,包含一个非负整数,表示你所求的方差的最小值的 n2 倍。

样例 #1

样例输入 #1

4
1 2 4 6

样例输出 #1

52

提示

【样例解释 #1】

对于 (a1,a2,a3,a4)=(1,2,4,6),第一次操作得到的数列有 (1,3,4,6),第二次操作得到的新的数列有 (1,3,5,6)。之后无法得到新的数列。

对于 (a1,a2,a3,a4)=(1,2,4,6),平均值为 134,方差为 14((1134)2+(2134)2+(4134)2+(6134)2)=5916

对于 (a1,a2,a3,a4)=(1,3,4,6),平均值为 72,方差为 14((172)2+(372)2+(472)2+(672)2)=134

对于 (a1,a2,a3,a4)=(1,3,5,6),平均值为 154,方差为 14((1154)2+(3154)2+(5154)2+(6154)2)=5916

【数据范围】

测试点编号 n ai
13 4 10
45 10 40
68 15 20
912 20 300
1315 50 70
1618 100 40
1922 400 600
2325 104 50

对于所有的数据,保证 1n1041ai600

历时一天半,共八届奥赛课加两节数学自习的努力,终于给他 A 了,下面简单回顾一下我这悲苦的历程

题目一开始是没什么思路的,但入手点一定得在操作上找,然后就设一个 a1,a2,a3,a4 开始自己胡乱手模

然后我就惊奇的发现,只模这个数是没什么作用的(因为我半个小时后什么也没得出来),然后就不看这个数了,开始

看俩数操作后的关系,就做了个差,然后。。就发现了一个惊奇的性质:操作一个数 ai 相当于把 a 的查分数组 x 中的

xi1xi 互换位置

那现在问题就转化成了找出一个 x 的排列使方差最小,然后就开始推式子了。。。

ai=a1+j=1i1xj , a¯=a1+1ni=1nj=1i1xj

n2D=ni=1n(aia¯)2

=ni=1n(a1+j=1i1xja11ni=1nj=1i1xj)2

=ni=1n[(j=1i1xj)22nj=1i1xji=1nj=1i1xj+1n2(i=1nj=1i1xj)2]

=i=1n[n(j=1i1xj)22j=1i1xji=1nj=1i1xj+1n(i=1nj=1i1xj)2]

=ni=1n(j=1i1xj)22i=1nj=1i1xji=1nj=1i1xj+1ni=1n(i=1nj=1i1xj)2

=ni=1n(j=1i1xj)2(i=1nj=1i1xj)2

=ni=1n1(j=1ixj)2(i=1n1j=1ixj)2

这就是我们答案的初始式子了,但我们不知道 x 序列的排列方式,所以。。。继续推

ni=1n1(j=1ixj)2(i=1n1j=1ixj)2

=ni=1n1j=1ik=1ixjxk(i=1n1xi(ni))2

=ni=1n1j=1n1xixj(nmax(i,j))i=1n1j=1n1xixj(ni)(nj)

=i=1n1j=1n1xixj[n(nmax(i,j))(ni)(nj)]

=i=1n1j=1n1xixj[n2nmax(i,j)n2+(i+j)nij]

=i=1n1j=1n1xixj[(i+j)nnmax(i,j)ij]

=i=1n1j=1n1xixj[nmin(i,j)ij]

我们发现这个 min 不太好处理,但是我们容易推出 i=1n1j=1n1xixj=2i=1n1j=1i1xixj+i=1n1xi2

所以原式可化为

=i=1n1xi2(ni)i+2i=1n1j=1i1xixj(ni)j

观察左边的式子发现,当中间部分的 x 较小时整体较小,这时我们看右边式子,列一下 n=7 时的矩阵

( i ,j ) i=2 i=3 i=4 i=5 i=6
j=5 (6,5)
j=4 (5,4) (6,4)
j=3 (4,3) (5,3) (6,3)
j=2 (3,2) (4,2) (5,2) (6,2)
j=1 (2,1) (3,1) (4,1) (5,1) (6,1)

我们同时列一下其对应的系数

( i ,j ) i=2 i=3 i=4 i=5 i=6
j=5 5
j=4 8 4
j=3 9 6 3
j=2 8 6 4 2
j=1 5 4 3 2 1

我们惊奇的发现,对于右面的式子,也是当中间 x 的值小时,整体值较小

所以我们就得到了:当 x 承单谷排列时,使答案最小

但我们又发现一个问题,我们只知道单谷排列,但并不知道“谷”在哪,所以我们就应该 DP

考虑我们初始的式子ni=1n1(j=1ixj)2(i=1n1j=1ixj)2

我们想让整体最小,就是想让i=1n1(j=1ixj)2最小时,且(i=1n1j=1ixj)2最大

但两个变量明显不好求,所以我们钦定i=1n1j=1ixj不变,去找每一个不同的和对应的最小的i=1n1(j=1ixj)2

这里我们的转移方程也出来了:fi,j 表示考虑前 i 个差分数组,i=1n1j=1ixj=j 时,最小的i=1n1(j=1ixj)2

这里应该提前从小到大排个序

考虑新进来一个 xi+1 对答案的影响,设 sumi 为前 i 个差分序列的和

  • 1:如果放在序列右面:

fi+1,j+xi+1+sumi=minfi,j+(xi+1+sumi)2

  • 2:如果放在序列左面:相当于之前填的序列整体右移

贡献为j=1i(xj+xi+1)2j=1ixj2

=j=1ixj2+j=1i2xjxi+1+j=1ixi+12j=1ixj2

=j=1i2xjxi+1+j=1ixi+12

=2jxi+1+ixi+12

最后加他本身的 xi+12

fi+1,j+xi+1(i+1)=minfi,j+2jxi+1+(i+1)xi+12

点击查看代码
#include<bits/stdc++.h>
const int maxn=1e4+10;
using namespace std;
int n,a[maxn],x[maxn],f[2][500001],sum[maxn],top,s,ans;


int main()
{
//	freopen("set1.in","r",stdin);
//	freopen("T.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		x[i-1]=i>1?a[i]-a[i-1]:0;
//		cout<<x[i-1]<<endl;
	}
	sort(x+1,x+n);
	for(int i=1;i<n;i++) sum[i]=sum[i-1]+x[i];
	memset(f,0x7f,sizeof f);
	f[1][x[1]]=x[1]*x[1];
	top=x[1];
	int temp=0;
	for(int i=1;i<n-1;i++)
	{
		temp^=1;
		top+=x[i+1]*(i+1);
		for(int j=0;j<=top;j++)
		{
			s=j+sum[i+1];
//			cout<<i<<" "<<j<<" "<<f[i][j]<<endl;
//			if(s>top) continue;
			f[temp^1][s]=min(1ll*f[temp^1][s],f[temp][j]+1ll*sum[i+1]*sum[i+1]);
		}
		for(int j=0;j<=top;j++)
		{
			s=j+x[i+1]*(i+1);
//			if(s>top) continue;
			f[temp^1][s]=min(1ll*f[temp^1][s],f[temp][j]+1ll*x[i+1]*x[i+1]*(i+1)+2ll*j*x[i+1]);
		}
		memset(f[temp],0x7f,sizeof f[temp]);
	}
	ans=0x7f7f7f7f;
	for(int i=0;i<=top;i++) 
//		cout<<f[(n-1)&1][i]<<endl;
		ans=min(1ll*ans,1ll*n*f[(n-1)&1][i]-1ll*i*i);
			
	cout<<ans<<'\n';
	
	return 0;
}

posted @   _君の名は  阅读(42)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示