コンセプト
離散的な、無限空間に有限は、アルゴリズムの効率を向上させるために限られた空間、時間と空間に個々にマッピングされます。
データの相対的な大きさを変更することなく、人気のあるその離散化条件は、データはそれに応じて低減されます。
例えば
テンプレートのタイトルリンク:間隔と
コードは以下の通りであります:
書式#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)