CF1642B 题解

题目传送门

题目大意

有一个长度为 n 的数组 a,现在你需要把这个数组 n 个的元素分成 k 部分,每一段的对答案的贡献是这一部分不同的数的个数,最后的答案是所有的贡献之和。
现在需要求 k=1,2,,n 的答案。
数据范围:n3×105,n3×105,ai109

题目解析

首先我们先求出整个序列有几个不同的数字,假设这个数字为 m
km 的时候,我们可以做到每个数字只出现在一个部分内,这样答案就是 m
k>m 的时候,我们在 k=m 构造的基础上将 km 个元素单独放在一个部分内,答案就是 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 @   jiangtaizhe001  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示