[SCOI2009]誕生日の贈り物単調足をエミュレート

問題の意味:各色の点間隔に存在するように、あなたに、n個のk個の色を与えるが、各点は、二つの座標と色属性を有する、できるだけ短い間隔の長さを選択します。

 

データ範囲:

データの50%、N≤10000。

データの80%、N≤800000。

データの100%、1≤N≤1000000,1≤K≤60、に0≦ ビーズ位置<2 ^ {31}

--------------------------------------------------私は----------------------------------------------行を分割しています---------

ソリューション:単調な足は、古典的なアプリケーションをエミュレート。一次の座標点二つの変数のLRは、間隔を列挙するならばLRの間隔は、要件を満たしていないRを、++場合はLのRセクションは、アンサー満たすL ++。

ソート時間複雑性O(NlogN)、足が時間複雑性O(N)を取り、合計時間複雑度は、O(NlogN)です。

#include <ビット/ STDC ++ H> の#defineは長い長いっ
 の#define融点make_pair用
 の#define REPは(iは、、B)は、(i ++は; iが=(B)<I =(A)INT)のため
 の#defineを(パーI、B)(iは(A = INT)のために、I> =(B); i--)使用して名前空間STDを、
typedefのペア < int型int型 > PII。
typedefをダブルデシベル。
CONSTのINT N = 1E6 + 50 構造体ノード{ int型のx、ID。} [N]。 
INTの N、K、H、VIS [N]、Q [N]、U、ANS = 1E9、CNT。
インラインint型リード(){
    



 
 INT X = 0、F = 1 チャー CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1CH = GETCHAR();}
     一方(CH> = ' 0 ' && CH <= ' 9 '){X =(x << 3)+(X << 1)+(CH ^ 48)。CH = GETCHAR();}
     戻りのx *のF。
BOOL mycmp(ノードA、ノードB){ 戻り AX < BX。}
 ボイドインサート(INT X){ 場合(VIS [X] == 0)CNT ++。VIS [X] ++ ; }
 ボイド削除(INT X){ 場合(VIS [X] == 1)cnt--。VIS [X] - }
 ボイドのinit(){ 
    N =)(読み取ります。K = リード()。
    担当者(I、1 、K){
         int型 T = 読み取ります()。
        担当者(J、1、T)[++ H] .X = read()は、[H] .ID = I。
    } 
    ソート(A + 1、+ N + 1 、mycmp)。
} 
ボイドワーク(){
     int型の L = 1、R = 1 一方、(R <= N){ 
        ([R] .ID)を挿入します。
        一方、){ 
            削除([L] .ID)。
            もし(CNT == k)がL ++  {([L] .ID)を挿入します。ブレーク;} 
        } 
        もし(CNT == k)はANS =分(ANS、[R] .X - [L] .X)。
        R ++ ; 
    } 
    のprintf(" %d個の\ n " 、ANS)。
}
INT メイン(){ 
    INIT()。
    作業(); 
    リターン 0 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/smilke/p/11580240.html