先日、クエリに関する問題が発生しましたが、解決できません。サブアレイクエリに迅速に応答する効率的なアルゴリズム
N整数と正の整数Mを持つ配列を考えると、あなたはQクエリに答える必要があります。各クエリは、(i,j)のように特徴付けられ、ここでおよびjがそれぞれ配列のインデックスです。各クエリでは、あなたが存在してどのように多くのペア(R、の)答えなければならないように
- 私 < = R < = S < = J
- 合計[r,s]の添字を持つ配列要素のうちの1つは、Mで割り切れる。 の
制限:
N <= 50,000
Q <= 50,000
M <= 100
私はO(N^2)ですべてのクエリ(R、の)を前処理、動的プログラミングソリューションを持っていますが、それが十分に高速ではありません。より効率的なソリューションはありますか?私はMoのアルゴリズム、またはセグメントツリーでいくつかのアイデアを持っていますが、それを得ることはできません。
配列を最初にソートします(対数複雑度)。今、部分範囲(i、j)はバイナリ検索で見つけることができます。与えられた(i、j)を計算するには、範囲モジュラスMのすべての値と各値[0、M]の数が事前に計算されます。それぞれのカウントに基づいて、可能な対の数を自明に計算することができる。 –
@SamVarshavchik、 '(i、j)'は配列のインデックスであり、値ではありません。 – DAle