1 条题解
-
0
题解:区间颜色贡献乘积和
问题转化
给定两个区间 和 ,设 为值 在第一个区间出现的次数, 为值 在第二个区间出现的次数,求:
关键推导
1. 公式展开
设 ,。
$$\text{ans} = \sum_{x} \left( \sum_{i \in A} [a_i = x] \right) \cdot \left( \sum_{j \in B} [a_j = x] \right) $$交换求和顺序:
$$\text{ans} = \sum_{i \in A} \sum_{j \in B} [a_i = a_j] $$2. 转化为平面计数
将每个位置 视为二维平面上的点 ,原问题变为:
计算矩形 中,满足 的点 的数量。3. 莫队二次离线
标准莫队一次只能处理一个区间,这里需要同时处理两个区间。
$$\sum_{i \in A} \sum_{j \in B} [a_i = a_j] = f(r_1, r_2) - f(l_1-1, r_2) - f(r_1, l_2-1) + f(l_1-1, l_2-1) $$
注意到:其中 。
于是问题转化为:快速计算 对任意 的查询。
4. 二维数点优化
对每个值 ,设它出现的位置为 。
在 中,值 的贡献为:其中 是 在 中出现的次数。
维护 需要 空间,但 ,可以接受。
5. 分块预处理
将序列分块,块大小为 。
预处理:
- :前 块中值 的出现次数( 从 0 到块数)
- :第 块到第 块之间的答案(只考虑整块)
6. 查询处理
对于查询 :
- 令 所在块为 , 所在块为
- 整块贡献从预处理 获取
- 剩余零散部分暴力枚举,用桶临时计数
7. 算法步骤
- 读入序列,离散化( 但可能稀疏)
- 分块,预处理 和
- 对每个询问 :
- 用二维前缀和公式拆成 4 个 查询
- 对每个 用分块方法计算
- 合并得到答案
8. 复杂度分析
- 预处理:
- 数组: 空间 ,用哈希表可优化
- :
- 单次查询:
- 总复杂度:
取 ,实际可行。
9. 优化实现
- 使用数组代替哈希表,因为值域
- 注意内存使用,可只存整块间的答案矩阵
- 零散部分用临时数组计数
10. 最终答案
对每个询问输出合并后的结果即可。
此方法在 的数据范围内可以在 秒内通过。
- 1
信息
- ID
- 6063
- 时间
- 2800ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者