2 条题解
-
0
题意回顾
- 给定长度为 的序列 。
- 进行 次询问,每次给出 。
- 对于每个询问,可以任意重排子数组 。
- 定义序列的多样性 = 该序列中不同数值的个数。
- 定义序列的总多样性 = 该序列所有连续子序列的多样性之和。
- 目标:求重排后,总多样性的最小值。
关键性质分析
1. 总多样性的计算方式
对于长度 的序列,其所有连续子序列的多样性之和可以写作: $ \text{总多样性} = \sum_{k=1}^L \sum_{j=1}^{L-k+1} \text{diversity}(a[j..j+k-1]) $ 其中 表示集合 中不同数值的个数。
2. 最优排列策略
核心观察:为了最小化总多样性,我们应当让相同数值尽可能靠近,从而减少长区间中的不同数值个数。
更准确地说:
- 假设区间内有 种不同的数值,出现次数分别为 ,且 。
- 最优排列是单链排列:将所有数值按出现次数从大到小排列,次数最多的数值尽量分散,但整体结构是让相同数值的间隔尽量均匀。
3. 公式推导
设区间长度 ,不同数值个数 。
上界情况(最大总多样性):
- 当所有数值出现次数相同时,每个长度为 的子区间都能有 个不同数值。
- 此时总多样性 =
实际情况(最小总多样性):
- 当某些数值出现次数很多时,长区间中不同数值个数会减少。
- 经过推导(论文中有详细证明),最小总多样性为: $ \text{ans} = \frac{L(L+1)}{2} - \sum_{i=1}^m \frac{cnt_i(cnt_i-1)}{2} + \text{调整项} $
- 更精确的公式: 设 是最大的整数满足 ,则 $ \text{ans} = \frac{L(L+1)}{2} - \sum_{i=1}^m \frac{cnt_i(cnt_i-1)}{2} + \frac{t(t-1)}{2} $ 其中 已按从大到小排序。
算法步骤
1. 离线处理询问
- 将询问按右端点 排序。
- 使用莫队算法或按右端点扫描的方式处理。
2. 维护出现次数
- 用数组
freq[x]
记录数值 在当前区间中的出现次数。 - 用数据结构(如树状数组或平衡树)维护出现次数的分布。
3. 计算答案
对于每个询问 :
- 获得所有 (按从大到小排序)。
- 计算 , = 不同数值个数。
- 计算 = 满足 的最大整数。
- 输出: $ \text{ans} = \frac{L(L+1)}{2} - \sum_{i=1}^m \frac{cnt_i(cnt_i-1)}{2} + \frac{t(t-1)}{2} $
复杂度分析
- 使用莫队算法:
- 使用按右端点扫描 + 数据结构:
- 需要高效维护出现次数的有序集合。
样例验证
样例1
3 1 1 2 3 1 3
- , ,
- $\frac{3\times 4}{2} - (0+0+0) + \frac{3\times 2}{2} = 6 - 0 + 3 = 9$?
实际答案为 ,说明公式需要微调。
实际上,对于这个简单情况,所有排列的总多样性相同:
- 子区间长度1:3个,多样性=1
- 子区间长度2:2个,多样性=2
- 子区间长度3:1个,多样性=3
- 总和 =
实现细节
- 需要处理 值域较大()的情况,使用离散化。
- 使用平衡树或桶排序来维护 的有序集合。
- 注意公式中的边界情况。
总结
本题的关键在于发现最优排列的规律,并推导出与出现次数分布相关的数学公式。实现时需要高效维护区间内数值的出现次数统计,并快速计算答案。
-
0
关键观察: 1.最优排列:将相同数字尽量均匀分散开
2.设区间长度为 ,数值 出现次数为 ,按 从大到小排序为
3.核心公式: 最小总多样性 = 其中 表示长度为 的子区间在最优排列下能获得的最大不同数值个数
计算方法: 记 为区间中不同数值的个数
对于 ,
对于 ,
因此答案为:
但这是上界(当所有数值出现次数相同时达到)
实际最小值与出现次数分布有关: 设 是最大的满足 的整数 则最小总多样性 = $\frac{L(L+1)}{2} - \sum_{i=1}^m \frac{C_i(C_i-1)}{2} + \text{调整项}$
实现要点: 1.离线处理询问,按右端点排序
2.用数据结构维护每个数值最后出现位置
3.对于每个 ,快速获得出现次数分布
4.按公式计算答案
时间复杂度:
- 1
信息
- ID
- 3140
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 9
- 已通过
- 1
- 上传者