CF1642B 题解

题目传送门

题目大意

有一个长度为 \(n\) 的数组 \(a\),现在你需要把这个数组 \(n\) 个的元素分成 \(k\) 部分,每一段的对答案的贡献是这一部分不同的数的个数,最后的答案是所有的贡献之和。
现在需要求 \(k=1,2,\dots,n\) 的答案。
数据范围:\(n\le 3\times10^5,\sum n\le 3\times10^5,a_i\le10^9\)

题目解析

首先我们先求出整个序列有几个不同的数字,假设这个数字为 \(m\)
\(k\le m\) 的时候,我们可以做到每个数字只出现在一个部分内,这样答案就是 \(m\)
\(k>m\) 的时候,我们在 \(k=m\) 构造的基础上将 \(k-m\) 个元素单独放在一个部分内,答案就是 \(k\)

核心代码:

int n,m,a[maxn];
void work(){
	n=read(); int i; for(i=1;i<=n;i++) a[i]=read(); sort(a+1,a+n+1); m=1;
	for(i=2;i<=n;i++) if(a[i]!=a[i-1]) m++;
	for(i=1;i<=n;i++)
		if(i<=m) print(m),pc(' ');
		else print(i),pc(' ');
	pc('\n'); return;
}
posted @ 2022-02-24 16:24  jiangtaizhe001  阅读(30)  评论(0编辑  收藏  举报