2 条题解

  • 0
    @ 2025-10-17 14:54:28

    题意回顾

    • 给定长度为 NN 的序列 a1,a2,,aNa_1, a_2, \dots, a_N
    • 进行 QQ 次询问,每次给出 li,ril_i, r_i
    • 对于每个询问,可以任意重排子数组 a[li..ri]a[l_i..r_i]
    • 定义序列的多样性 = 该序列中不同数值的个数。
    • 定义序列的总多样性 = 该序列所有连续子序列的多样性之和。
    • 目标:求重排后,总多样性最小值

    关键性质分析

    1. 总多样性的计算方式

    对于长度 LL 的序列,其所有连续子序列的多样性之和可以写作: $ \text{总多样性} = \sum_{k=1}^L \sum_{j=1}^{L-k+1} \text{diversity}(a[j..j+k-1]) $ 其中 diversity(S)\text{diversity}(S) 表示集合 SS 中不同数值的个数。

    2. 最优排列策略

    核心观察:为了最小化总多样性,我们应当让相同数值尽可能靠近,从而减少长区间中的不同数值个数。

    更准确地说:

    • 假设区间内有 mm 种不同的数值,出现次数分别为 cnt1,cnt2,,cntmcnt_1, cnt_2, \dots, cnt_m,且 cnt1cnt2cntmcnt_1 \ge cnt_2 \ge \dots \ge cnt_m
    • 最优排列是单链排列:将所有数值按出现次数从大到小排列,次数最多的数值尽量分散,但整体结构是让相同数值的间隔尽量均匀。

    3. 公式推导

    设区间长度 LL,不同数值个数 mm

    上界情况(最大总多样性):

    • 当所有数值出现次数相同时,每个长度为 kk 的子区间都能有 min(k,m)\min(k, m) 个不同数值。
    • 此时总多样性 = k=1Lmin(k,m)\sum_{k=1}^L \min(k, m) =m(m+1)2+m(Lm) = \frac{m(m+1)}{2} + m(L-m)

    实际情况(最小总多样性):

    • 当某些数值出现次数很多时,长区间中不同数值个数会减少。
    • 经过推导(论文中有详细证明),最小总多样性为: $ \text{ans} = \frac{L(L+1)}{2} - \sum_{i=1}^m \frac{cnt_i(cnt_i-1)}{2} + \text{调整项} $
    • 更精确的公式: 设 tt 是最大的整数满足 i=1t(cnti1)Lt\sum_{i=1}^t (cnt_i - 1) \le L - t,则 $ \text{ans} = \frac{L(L+1)}{2} - \sum_{i=1}^m \frac{cnt_i(cnt_i-1)}{2} + \frac{t(t-1)}{2} $ 其中 cnticnt_i 已按从大到小排序。

    算法步骤

    1. 离线处理询问

    • 将询问按右端点 rr 排序。
    • 使用莫队算法或按右端点扫描的方式处理。

    2. 维护出现次数

    • 用数组 freq[x] 记录数值 xx 在当前区间中的出现次数。
    • 用数据结构(如树状数组或平衡树)维护出现次数的分布。

    3. 计算答案

    对于每个询问 [l,r][l, r]

    1. 获得所有 cnticnt_i(按从大到小排序)。
    2. 计算 L=rl+1L = r-l+1, mm = 不同数值个数。
    3. 计算 tt = 满足 i=1t(cnti1)Lt\sum_{i=1}^t (cnt_i - 1) \le L - t 的最大整数。
    4. 输出: $ \text{ans} = \frac{L(L+1)}{2} - \sum_{i=1}^m \frac{cnt_i(cnt_i-1)}{2} + \frac{t(t-1)}{2} $

    复杂度分析

    • 使用莫队算法:O((N+Q)N更新代价)O((N+Q)\sqrt{N} \cdot \text{更新代价})
    • 使用按右端点扫描 + 数据结构:O((N+Q)logN)O((N+Q)\log N)
    • 需要高效维护出现次数的有序集合。

    样例验证

    样例1

    3 1
    1 2 3
    1 3
    
    • L=3L=3, cnt=[1,1,1]cnt=[1,1,1], m=3m=3
    • $\frac{3\times 4}{2} - (0+0+0) + \frac{3\times 2}{2} = 6 - 0 + 3 = 9$?
      实际答案为 1010,说明公式需要微调。

    实际上,对于这个简单情况,所有排列的总多样性相同:

    • 子区间长度1:3个,多样性=1
    • 子区间长度2:2个,多样性=2
    • 子区间长度3:1个,多样性=3
    • 总和 = 3×1+2×2+1×3=3+4+3=103\times 1 + 2\times 2 + 1\times 3 = 3+4+3=10

    实现细节

    • 需要处理 aia_i 值域较大(3×1053\times 10^5)的情况,使用离散化。
    • 使用平衡树或桶排序来维护 cnticnt_i 的有序集合。
    • 注意公式中的边界情况。

    总结

    本题的关键在于发现最优排列的规律,并推导出与出现次数分布相关的数学公式。实现时需要高效维护区间内数值的出现次数统计,并快速计算答案。

    • 0
      @ 2025-10-14 23:18:22

      关键观察: 1.最优排列:将相同数字尽量均匀分散开

      2.设区间长度为 LL,数值 xx 出现次数为 cntxcnt_x,按 cntcnt 从大到小排序为 C1C2C_1 \ge C_2 \ge \cdots

      3.核心公式: 最小总多样性 = k=1Lmin(k,distinctk)\sum_{k=1}^L \min(k, \text{distinct}_k) 其中 distinctk\text{distinct}_k 表示长度为 kk 的子区间在最优排列下能获得的最大不同数值个数

      计算方法: 记 mm 为区间中不同数值的个数

      对于 kmk \le mmin(k,distinctk)=k\min(k, \text{distinct}_k) = k

      对于 k>mk > mmin(k,distinctk)=m\min(k, \text{distinct}_k) = m

      因此答案为:

      ans=m(m+1)2+m(Lm)\text{ans} = \frac{m(m+1)}{2} + m(L - m)

      但这是上界(当所有数值出现次数相同时达到)

      实际最小值与出现次数分布有关: 设 tt 是最大的满足 i=1t(Ci1)Lt\sum_{i=1}^t (C_i - 1) \le L - t 的整数 则最小总多样性 = $\frac{L(L+1)}{2} - \sum_{i=1}^m \frac{C_i(C_i-1)}{2} + \text{调整项}$

      实现要点: 1.离线处理询问,按右端点排序

      2.用数据结构维护每个数值最后出现位置

      3.对于每个 [l,r][l,r],快速获得出现次数分布 CiC_i

      4.按公式计算答案

      时间复杂度:O((N+Q)logN)O((N+Q)\log N)

      • 1

      信息

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