首页 > 其他分享 >题解 NOIP2021 方差

题解 NOIP2021 方差

时间:2023-11-23 14:11:37浏览次数:47  
标签:limits 方差 题解 sum space times NOIP2021 ll

原题

我认为这道题非常困难 码量并不大 可是需要很多次思维跳跃

题意

题意概述:

给定非严格递增序列 \(a_{n}\) 可以进行若干次操作,求序列方差最小值的\(n^2\)倍

方差的定义为 \(D = \frac{1}{n} \sum_{i = 1}^{n} {(a_i - \bar a)}^2\),其中 \(\bar a = \frac{1}{n} \sum_{i = 1}^{n} a_i\)。

操作的定义:选取一个位置 \(i\space (1<i<n)\) 使得 \(a_i=a_{i-1}-a_i+a_{i+1}\)

其中 \(n\leq 10^4,\in a_i\le600\)

思路

1.操作本质

一个十分奇怪的操作 操作是选一个数 然后变为两边数的和减去当前的数

举个例子:

\(a\space b\space c\space d\to a\space a+c-b\space c\space d\)

这个时候可以把操作丢到数轴上思考:

手推一推 不难发现是 \(b\) 到 \(a\) 和 \(c\) 的距离交换

换句话说,就是交换差分

就此 这就是操作本质

2.求值本质

方差最小值?考虑化简方差式子

令 \(s=\sum\limits_{i=1}^na_i\)

则 \(D=n\sum\limits_{i=1}^n(a_i-\frac{s}{n})^2\)

拆开 \(D=n\sum\limits_{i=1}^n{a_i}^2+s^2-2\times\sum\limits_{i=1}^na_i\times s\)

最后化简得 \(D=n\sum\limits_{i=1}^n{a_i}^2-(\sum\limits_{i=1}^na_i)^2\)

至此,化简完毕

3.问题性质

得到交换差分之后 我们要进行推导

由于第一个差分不可以交换 放到最后考虑即可

令 \(d_i=a_i-a_{i-1}\) 继续拆式子

这一段拆了很久 放上最后的结果

\(D=n\sum\limits_{i=1}^n{d_i}^2\times i\times (n-i)+2\sum\limits_{j=1}^n\sum\limits_{k=j+1}^nd_j\times d_k\times k\times (n-j)\)

这个式子有什么呢?因为 \(d_j\times d_k\)是不会变的 而 \(i\times(n-i)\) 和 \(k\times (n-j)\) 这类式子会在值域中间取到最大值 因此 得到最小值 必须使中间的值最小.

最难的一部分就在这里.

4.问题解决

弄清性质 容易考虑 dp 算法

将差分数组排序 枚举这个数放在前面或者后面

那么,状态是什么呢?

我们发现答案的贡献为

\(D=n\sum\limits_{i=1}^n{a_i}^2-(\sum\limits_{i=1}^na_i)^2\)

\(\sum\limits_{i=1}^n{a_i}^2\) 非常不好维护 考虑维护 \(\sum\limits_{i=1}^na_i\)

定义 \(f_{i,j}\) 表示考虑到 \(i\) 差分 目前所有 \(\in a_x\) 的和为 \(j\) 时 所有数的平方和最小

记录 \(s_i\) 表示 \(\sum\limits_{j=1}^id_j\)

考虑将一个状态转移出去 那么有

1.放到当前数组的后面 \(f_{i+1,j+s_i}\to f_{i,j}+{s_i}^2\)

2.放到当前数组的前面 \(f_{i+1,j+i\times d_i}\to f_{i,j}+i\times{d_i}^2+2\times j \times d_i\)

枚举状态 \(O(n^2V)\) 转移 \(O(1)\)

可以得到 80pts

5.问题优化

时间复杂度太高了

考虑减少枚举状态数 因为有很多状态是不会转移到的

使用剪枝优化即可满分

时间复杂度 \(O(nV\min(n,V))\)

其他问题

统计答案要记得把第一个数插到队头

记得 long long

可以使用滚动数组优化

Code

#include<bits/stdc++.h>
#define ll long long
#define N 10005
#define V 605
using namespace std;
ll n;
ll d[N],sum;
ll a[N],s[N];
ll f[2][V*N*2];
ll ans=4e18;
int main() 
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]),
		d[i-1]=a[i]-a[i-1];
	sort(d+1,d+n);
	for(int i=1;i<n;i++)
		s[i]=s[i-1]+d[i];
	fill(&f[0][0],&f[1][V*N*2-5],4e18);
	f[1][0]=0;
	sum=0;
	for(ll i=1;i<n;i++)
	{
		int p=i&1;
		for(ll j=0;j<=sum;j++)
		{
			//放右边 
			f[p^1][j+s[i]]=min(f[p^1][j+s[i]],f[p][j]+s[i]*s[i]);
			if(f[p^1][j+s[i]]!=4e18) sum=max(sum,j+s[i]);
			//左边
			f[p^1][j+d[i]*i]=min(f[p^1][j+d[i]*i],f[p][j]+2*j*d[i]+i*d[i]*d[i]); 
			if(f[p^1][j+d[i]*i]!=4e18) sum=max(sum,j+d[i]*i);
		}
		for(int j=0;j<=sum;j++)
			f[p][j]=4e18;
	}
	for(ll i=0;i<=sum;i++)
	{
		if(f[n&1][i]==4e18) continue;
		ans=min(ans,1ll*n*(f[n&1][i]+2ll*i*a[1]+n*a[1]*a[1])-(i+a[1]*n)*(i+a[1]*n));
	}
	printf("%lld",ans);
	return 0;
}

标签:limits,方差,题解,sum,space,times,NOIP2021,ll
From: https://www.cnblogs.com/g1ove/p/17851419.html

相关文章

  • VS 调试 提示 Lc.exe已退出 代码为-1问题解决方法
    找到程序项目下Properties文件夹licenses.licx文件,然后右键选择删除就可以了,调试运行正常了 https://jingyan.baidu.com/article/b24f6c822592b686bfe5daac.html......
  • ARC168(A-C)题解
    比赛链接:arc168A题意:读入一个由<和>构成的字符串,在最开始,最后,字符之间可以填上任意数字,任意两个相邻数字之间必须满足字符代表的大小关系。求问最后填入的数字组成的数组最少有多少对逆序对。题解:签到。<可以不去考虑,因为不会对答案造成影响。>如果不是在连续段内,也可以不......
  • [Codeforces] CF1475C Ball in Berland 题解
    BallinBerland-洛谷题意在毕业典礼上,有​个男孩和​个女孩准备跳舞,不是所有的男孩和女孩都准备结伴跳舞。现在你知道​个可能的舞伴,你需要选择其中的两对,以便使没有人重复地出现在舞伴里,求可能的数量。思路暴力最朴素,也是简单的方法,就是通过暴力组合进行配对。#include......
  • 【题解】HD2016.X1,HD2016.X3,HD2016.X4,HD2016.X5
    [HD2016.X1]价钱统计题目描述夏天到了,超市里摆满了各种各样的应季水果。现在知道:西瓜的价钱是每斤1.2元;桃子的价钱是每斤3.5元;葡萄的价钱是每斤4.5元;苹果的价钱是每斤5元。现在分别给出上述四种所购买的斤数(均不超过20),请你编写程序帮助售货员阿姨计算并依次输出顾客......
  • COMP 340 操作系统 Bounded Buffer问题解决
    这里有3个发生器,每个发生器独立地产生一种独特的材料。所有这些材料在被转发给操作员之前被存储在大小为10的输入缓冲器中。我们有三个具有相同优先级的运营商,他们负责生产基于这些材料。每种产品需要2种不同的材料。每次操作员需要2个用于此目的的工具。总共为这些操作员提供了3......
  • composer无法下载问题解决
    composerrequirejaeger/querylist[Composer\Downloader\TransportException] The"https://packagist.phpcomposer.com/p/provider-2017%241fcb04ee223fce21d167c8a49f09025ba85c917aee976588a99ef82c3a a609dc.json"filecouldnotbedownloaded(HTTP/1.......
  • P8907 [USACO22DEC] Making Friends P 题解
    明明看着不难的题目,却意外的卡人。思路考虑两头奶牛可以成为朋友条件是什么。存在一条路径连接这两头奶牛。且除去端点外的路径上的所有点的编号小于两端点的较小值。充分必要性都比较显然。如何维护。我们可以从小到大加入点,维护这些路径。对于每个点维护一个\(\text{se......
  • 【luogu题解】P9749 [CSP-J 2023] 公路
    \(Meaning\)\(Solution\)这道题我来讲一个不一样的解法:\(dp\)在写\(dp\)之前,我们需要明确以下几个东西:状态的表示,状态转移方程,边界条件和答案的表示。状态的表示\(dp[i]\)表示到达第\(i\)个站点所需要的最少钱数,\(w[i]\)表示在使用最少钱数到达第\(i\)个站点时多余......
  • 【模板】最小度限制生成树 题解
    其他的题解感觉都好高级,分享一种好想且好实现的方法。我们可以先把点\(s\)和与其相连的边都删除,我们发现剩下的部分变成了一些连通块。我们不难发现,当要求与\(s\)点相连的边的个数为\(k\)时,我们的连通块个数显然是\(k\)的。接下来这个问题就转化成了:\(n-1\)个点中生......
  • [IOI2015] Teams 题解
    妙妙题。不难发现,我们对于每个\(k\)取出的人都是满足\(a_i\leqk\leqb_i\)的。经典的,我们直接将\((a_i,b_i)\)转化到二维平面上,将它转化成一个二维数点问题。我们对于每一个询问,都使\(k\)有序,从小到大贪心的选择,也就相当于\(x\)轴限制不断向右,\(y\)轴限制不断......