题目大意
有一个长度为 \(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;
}