【发布时间】:2017-08-01 23:59:50
【问题描述】:
前几天遇到了一个查询相关的问题,但是解决不了。
给定一个包含 N 个整数和一个正整数 M 的数组,您必须回答 Q 个查询。每个查询的特征是 ( i , j ),其中 i 和 j 是数组的每个索引。在每个查询中,您必须回答存在多少对( r , s )使得
- i r s j
- 索引在 [ r , s ] 中的数组元素之和可被 M 整除。
限制:
N <= 50,000
Q <= 50,000
M <= 100
我有一个动态编程解决方案,可以预处理 O( N^2 ) 中的每个查询( r , s ),但那是不够快。有没有更有效的解决方案?我对 Mo 的算法或分段树有一些想法,但我无法得到它。
【问题讨论】:
-
先对数组进行排序(对数复杂度)。现在可以通过二分搜索找到子范围 (i,j)。要计算给定的 (i,j),请预先计算范围模数 M 中的所有值,以及每个值 [0,M) 出现的次数。根据每个的计数,可以简单地计算可能的对数。
-
@SamVarshavchik,
(i, j)是数组的索引,而不是值。