基本的なアルゴリズム - ディスクリート

コンセプト

  離散的な、無限空間に有限は、アルゴリズムの効率を向上させるために限られた空間、時間と空間に個々にマッピングされます。

  データの相対的な大きさを変更することなく、人気のあるその離散化条件は、データはそれに応じて低減されます。

例えば

  テンプレートのタイトルリンク:間隔と

  コードは以下の通りであります:

書式#include <iostreamの> 
の#include <アルゴリズム> 
書式#include <ベクトル> 使用して名前空間はstdを、const int型 N = 100010 ; 
ベクトル < int型 > オールズ。INTのN、M。
INT X [N]、[N]、L [N]、R [N] C。
INT [N * 3 ]、S [N * 3 ]。// 找到X在オールズ中的下标INT(見つけるINT X)
{ int型の L = 0、R = alls.size() - 1 ;
    一方、(L < R)
    {

 

 






    
        INT半ば= L + R >> 1 もし(オールズ[中間]> = X)R = ミッド。
        リットル=ミッド+ 1 ; 
    } 
    戻り R + 1 
} 

int型のmain()
{ 
    scanf関数(" %D%dの"、&​​N、&M)。

    以下のためにint型私= 0 ; iがN <; Iは++ 
    { 
        scanf関数(" %D%dの"、およびX [i]は、&C [I])。
        alls.push_back(X [I])。
    } 
    のためのINTI = 0 ; 私は<M。私は++ 
    { 
        scanf関数(" %d個の%のD "、&​​L [I]を、&R [I])。
        alls.push_back(L [i])と、alls.push_back(R [I])。
    } 

    // 排序+判重
    ソート(alls.begin()、alls.end())。
    alls.erase(ユニーク(alls.begin()、alls.end())、alls.end())。

    // 插入操作
    のためのint型 i = 0 ; iがn <; iは++)[検索(X [I])] + = C [i]は、

    // 预处理前缀和
    のためにint型 I = 1 ; I <= alls.size(); iは++)S [I] = sの[I - 1 ] + [I]。

    //查询操作
    のためにINT i = 0 ; iがmを<; iは++)のprintf(" %Dを\ n "、sは[R [i]が)(検索] - sは[(見つけるL [I]) - 1 ]) ; 

    リターン 0 ; 
}

  推奨演習:リングに牛(POJ3179)


 

おすすめ

転載: www.cnblogs.com/ninedream/p/11241165.html