1 条题解

  • 0
    @ 2026-4-5 14:05:00

    Cute Subsequences 详细中文题解

    一、题目重述与核心概念解析

    题目大意

    给定长度为nn的正整数数组aa,和正整数kk,要求:

    1. 将数组划分成kk个非空子序列,每个元素恰好属于一个子序列;
    2. 对第ii个子序列(元素下标j1<j2<<jlj_1<j_2<\dots<j_l),定义它的为:max1ml(ajm+m)\max\limits_{1\leq m\leq l} (a_{j_m} + m)mm是元素在子序列中的位置);
    3. 划分的总代价是所有子序列的值之和,求最大总代价

    关键定义澄清

    • 子序列:保持原数组顺序,元素可拆分到不同子序列,不要求连续;
    • 子序列的值:元素在子序列内的位置mm + 元素本身的值,取这个和的最大值;
    • 约束1kn5×1051\leq k\leq n\leq 5\times10^5ai109a_i\leq10^9,要求O(nlogn)O(n\log n)算法。

    二、公式转化与核心观察

    第一步:位置公式变形

    设原数组中第xx个元素(axa_x)被分到某个子序列的mm,则这个元素对所在子序列的值的贡献为:

    ax+ma_x + m

    我们可以把子序列内的位置mm 转化为原数组的全局计数

    • 假设我们把数组分成kk个子序列,遍历原数组时,每个元素会被分配到其中一个子序列的末尾;
    • 对于原数组第xx个元素,它在子序列中的位置mm = 该元素被分配到的子序列,此前已经分配的元素个数 + 1

    第二步:核心结论

    我们先计算所有元素的基础值

    S=x=1n(ax+1)S = \sum_{x=1}^n (a_x + 1)

    这个值对应:把每个元素单独作为一个子序列时的总代价(此时每个元素的m=1m=1,值为ax+1a_x+1)。

    当我们需要合并子序列(从nn个合并到kk个,需要合并nkn-k次)时,总代价只会减少,不会增加。 因此:最大化总代价 = 最小化合并带来的损失

    第三步:合并损失的计算

    对于两个元素x<yx<y,如果把aya_y接在axa_x所在子序列的末尾:

    • axa_x的位置不变,贡献不变;
    • aya_y的位置从11变成22,它的贡献从ay+1a_y+1变成ay+2a_y+2吗?❌ 错误!

    正确的贡献公式: 对原数组第ii个元素aia_i,定义:

    bi=ai+ib_i = a_i + i

    这是本题的核心转化公式

    最终核心结论

    1. 答案的基础总和 = i=1nbik(k+1)2\sum_{i=1}^n b_i - \frac{k(k+1)}{2}
    2. 我们需要选择kk个最大的bib_i,最终答案 = 这kk个最大bib_i的和。

    三、证明

    1. 每个子序列的值,等价于该子序列中最大的bib_ibi=ai+ib_i=a_i+i);
    2. 总代价 = 所有子序列的最大值之和;
    3. 要让总和最大,只需kk个最大的bib_i,让每个最大值分别作为一个子序列的最大值

    这是解决本题的唯一核心:计算所有bi=ai+ib_i=a_i+i,取前kk大的数求和


    四、样例验证

    输入: n=5,k=3n=5, k=3 a=[3,7,10,1,2]a = [3,7,10,1,2]

    计算bi=ai+ib_i = a_i + i(下标从1开始):

    • b1=3+1=4b_1=3+1=4
    • b2=7+2=9b_2=7+2=9
    • b3=10+3=13b_3=10+3=13
    • b4=1+4=5b_4=1+4=5
    • b5=2+5=7b_5=2+5=7

    bb数组:[4,9,13,5,7][4,9,13,5,7]前3大的数:13,9,713,9,7 求和:13+9+7=2413+9+7=24,与样例输出一致。


    五、算法设计

    步骤

    1. 遍历数组,计算每个位置的bi=ai+(i+1)b_i = a_i + (i+1)(代码中下标从0开始);
    2. bb数组降序排序
    3. 取前kk个元素求和,输出结果。

    复杂度分析

    • 计算bib_iO(n)O(n)
    • 排序:O(nlogn)O(n\log n)
    • 求和:O(k)O(k) 总复杂度O(nlogn)O(n\log n),完美适配n5×105n\leq5\times10^5的约束。

    七、总结

    1. 核心转化:将子序列内位置mm与原数组下标结合,得到bi=ai+ib_i=a_i+i
    2. 本质:总代价等于kk个最大bib_i的和;
    3. 解法:计算bib_i→排序→取前kk大求和;
    4. 复杂度O(nlogn)O(n\log n),通过所有测试用例。
    • 1

    信息

    ID
    6383
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者