会员专享
请先
登录 ,登录后可使用今日免费解锁;
开通会员 后可解锁完整内容。
思路分析
我们的目标是最大化 ∑ vac ( i ) \sum \operatorname{vac}(i) ∑ vac ( i ) 。由于 vac ( i ) \operatorname{vac}(i) vac ( i ) 的定义依赖于前缀空缺数,并且 vac ( i ) \operatorname{vac}(i) vac ( i ) 序列是非递减的(vac ( 1 ) ≤ vac ( 2 ) ≤ ⋯ ≤ vac ( n ) \operatorname{vac}(1) \le \operatorname{vac}(2) \le \dots \le \operatorname{vac}(n) vac ( 1 ) ≤ vac ( 2 ) ≤ ⋯ ≤ vac ( n ) ),我们希望让 vac ( i ) \operatorname{vac}(i) vac ( i ) 的值尽可能早地、尽可能大地增长。
vac ( i ) \operatorname{vac}(i) vac ( i ) 的值等于集合 { x 1 , … , x i } \{x_1, \dots, x_i\} { x 1 , … , x i } 中未出现的最小非负整数。为了让 vac ( i ) \operatorname{vac}(i) vac ( i ) 的值变大,我们需要让前缀 { x 1 , … , x i } \{x_1, \dots, x_i\} { x 1 , … , x i } 尽可能地包含从 0 0 0 开始的连续整数。
为了最大化 vac ( 1 ) \operatorname{vac}(1) vac ( 1 ) ,我们应该选择 x 1 = 0 x_1=0 x 1 = 0 (如果给定的元素中有 0 0 0 的话)。这样 vac ( 1 ) = 1 \operatorname{vac}(1)=1 vac ( 1 ) = 1 。如果选择其他数,vac ( 1 ) = 0 \operatorname{vac}(1)=0 vac ( 1 ) = 0 。
为了最大化 vac ( 2 ) \operatorname{vac}(2) vac ( 2 ) ,在 x 1 = 0 x_1=0 x 1 = 0 的基础上,我们应该选择 x 2 = 1 x_2=1 x 2 = 1 (如果给定的元素中有 1 1 1 的话)。这样 { x 1 , x 2 } = { 0 , 1 } \{x_1, x_2\} = \{0, 1\} { x 1 , x 2 } = { 0 , 1 } ,使得 vac ( 2 ) = 2 \operatorname{vac}(2)=2 vac ( 2 ) = 2 。
以此类推,为了让 vac ( i ) \operatorname{vac}(i) vac ( i ) 达到最大可能值 i i i ,我们需要让前缀 { x 1 , … , x i } \{x_1, \dots, x_i\} { x 1 , … , x i } 恰好是 { 0 , 1 , … , i − 1 } \{0, 1, \dots, i-1\} { 0 , 1 , … , i − 1 } 。
题目内容
给定一个长度为 n n n 的整数序列,你可以将其中的元素重新排列成任意顺序。对于排列后的序列 x 1 , x 2 , … , x n x_1, x_2, \dots, x_n x 1 , x 2 , … , x n ,定义第 i i i 个前缀的 空缺数 为:在前 i i i 个元素组成的集合中,未出现的最小非负整数,记作 vac ( i ) \operatorname{vac}(i) vac ( i ) 。你的目标是最大化所有前缀空缺数的总和 ∑ i = 1 n vac ( i ) \sum_{i=1}^n \operatorname{vac}(i) ∑ i = 1 n vac ( i ) 。请输出这个最大总和,并给出一个能达到该值的排列。
约束条件 :序列的长度 n n n 满足 1 ≤ n ≤ 2 i m e s 10 5 1 \le n \le 2 imes 10^5 1 ≤ n ≤ 2 im es 1 0 5 ;序列中的所有元素均为非负整数,且大小不超过 10 9 10^9 1 0 9 。
输入描述
第一行输入一个整数 n n n ,表示序列的长度。
第二行输入 n n n 个整数,表示初始序列中的元素。
输出描述
开通会员即可查看完整视频题解: 1.题目讲解 2.思路分析 3.逐行代码手写