与えられた範囲の交差点を見つけますか?

モハメドELテア

N(N <= 100000)要素a1、a2、....、anの配列を想定し、その中に範囲が与えられますL、Rここで、1 <= L <= R <= N、数を取得する必要があります与えられたセットSから少なくとも1つの数で割り切れる、与えられた範囲内の値の場合、このセットは{1,2、....、10}の任意のサブセットにすることができます。複数の範囲と複数のSを要求する可能性があるため(多くのクエリQ、Q <= 100000)、高速な方法を使用する必要があります。そのため、毎回値をループするのは非常に遅くなります。

それぞれN個の要素の10個の配列に大きなセット{1,2、....、10}の各数値で割り切れる値の数を格納し、累積合計を行って特定の数値で割り切れる値の数を取得することを考えましたO(1)時間の任意の範囲で、たとえば、次の少なくとも1つで割り切れる値の数を取得する必要がある場合:2、3、5、次に、それぞれで割り切れる値の数を加算してから削除します。交差点ですが、毎回2 ^ 10または2 ^ 9の計算を行わずに交差点を計算する方法を適切に理解していませんでした。これも、100000回実行される可能性があるため、非常に遅くなります(おそらくメモリを大幅に消費します)。 ?

kraskevich

あなたの考えは正しいです。包除原理と接頭辞の合計を使用して、答えを見つけることができます。あなたがする必要があるもう一つの観察があります。

数字のペアがaありba除算するようなセットにある場合クエリへの回答を変更せずにb削除できbます(実際、、の場合)。したがって、要素が他の要素を分割しないようなセットを常に取得します。b | xa | x

そのようなマスクの数は2^10よりも少ないです実際、それは102です。これを計算するコードは次のとおりです。

def good(mask):
    for i in filter(lambda b: mask & (1 << (b - 1)), range(1, 11)):
        if (any(i % j == 0 for j in filter(lambda b: mask & (1 << (b - 1)), range(1, i)))):
            return False            
    return True

print(list(filter(good, range(1, 2 ** 10)))))

したがって、前処理には100N、保存するためのおおよその操作と数が必要です(かなり小さいように見えます)。

さらに、5「適切な」マスクにはほとんどの要素があります(上記のコードを使用して確認できます)。したがって、around2^5操作を使用して各クエリに答えることができます

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

その中に描かれた線の長方形のエッジ上の交差点を見つけます

分類Dev

指定された範囲と範囲値から残りのKMを見つけます:最小= 0、最大= 999999

分類Dev

与えられた範囲のペア値を見つける

分類Dev

与えられた数の範囲を見つける方法は?

分類Dev

与えられた範囲でxより大きい要素の数を見つけます

分類Dev

線が平行であるか、一致しているか、または交差しているかを調べます。それらが交差する場合は、交差点を見つけます

分類Dev

範囲を見つけて、見つかった範囲に基づいて別の範囲からコンテンツをクリアします

分類Dev

与えられた範囲の回文数を見つけるJavaプログラム

分類Dev

4つの列から最小値を見つけて、それを別の列の範囲と比較しますか?

分類Dev

指定された範囲からいくつかの範囲を除外します

分類Dev

値の範囲から指定された値を見つける方法は?

分類Dev

与えられた範囲内の整数の数を見つける方法は、ビットを設定しています

分類Dev

bisect-leftmostとbisect-rightmostをマージして、並べ替えられた配列内の重複の範囲を見つけます

分類Dev

ソートせずにラインとメッシュグリッドの交差点を見つけますか?

分類Dev

いくつかの条件が満たされるnumpy配列で長さNの範囲を見つけます

分類Dev

指定された範囲内の関数の根を見つけます

分類Dev

2つの範囲の間で交差するセットを見つける

分類Dev

与えられた範囲内のn個の数の倍数の数を見つける

分類Dev

与えられた日付からX年の稼働日を見つけます

分類Dev

与えられた値の範囲で最大の奇数フィボナッチ数を見つける

分類Dev

与えられた範囲内の倍数を見つけるアルゴリズムの高速化

分類Dev

要素として文字列を持つリストのリストから交差点を見つける

分類Dev

複数の列範囲でLastRowを見つけますか?

分類Dev

与えられた範囲の間にあるインデックスを見つける

分類Dev

与えられたデータで最大の正の数を見つけますか?

分類Dev

範囲内の設定日と交差する最小開始日を見つける

分類Dev

numpyで範囲タプル間の交差を見つける

分類Dev

単一のネストされたリストから交差点を取得しますか?

分類Dev

SVGパスの交差点から新しいパス(形状)を見つける方法は?

Related 関連記事

  1. 1

    その中に描かれた線の長方形のエッジ上の交差点を見つけます

  2. 2

    指定された範囲と範囲値から残りのKMを見つけます:最小= 0、最大= 999999

  3. 3

    与えられた範囲のペア値を見つける

  4. 4

    与えられた数の範囲を見つける方法は?

  5. 5

    与えられた範囲でxより大きい要素の数を見つけます

  6. 6

    線が平行であるか、一致しているか、または交差しているかを調べます。それらが交差する場合は、交差点を見つけます

  7. 7

    範囲を見つけて、見つかった範囲に基づいて別の範囲からコンテンツをクリアします

  8. 8

    与えられた範囲の回文数を見つけるJavaプログラム

  9. 9

    4つの列から最小値を見つけて、それを別の列の範囲と比較しますか?

  10. 10

    指定された範囲からいくつかの範囲を除外します

  11. 11

    値の範囲から指定された値を見つける方法は?

  12. 12

    与えられた範囲内の整数の数を見つける方法は、ビットを設定しています

  13. 13

    bisect-leftmostとbisect-rightmostをマージして、並べ替えられた配列内の重複の範囲を見つけます

  14. 14

    ソートせずにラインとメッシュグリッドの交差点を見つけますか?

  15. 15

    いくつかの条件が満たされるnumpy配列で長さNの範囲を見つけます

  16. 16

    指定された範囲内の関数の根を見つけます

  17. 17

    2つの範囲の間で交差するセットを見つける

  18. 18

    与えられた範囲内のn個の数の倍数の数を見つける

  19. 19

    与えられた日付からX年の稼働日を見つけます

  20. 20

    与えられた値の範囲で最大の奇数フィボナッチ数を見つける

  21. 21

    与えられた範囲内の倍数を見つけるアルゴリズムの高速化

  22. 22

    要素として文字列を持つリストのリストから交差点を見つける

  23. 23

    複数の列範囲でLastRowを見つけますか?

  24. 24

    与えられた範囲の間にあるインデックスを見つける

  25. 25

    与えられたデータで最大の正の数を見つけますか?

  26. 26

    範囲内の設定日と交差する最小開始日を見つける

  27. 27

    numpyで範囲タプル間の交差を見つける

  28. 28

    単一のネストされたリストから交差点を取得しますか?

  29. 29

    SVGパスの交差点から新しいパス(形状)を見つける方法は?

ホットタグ

アーカイブ