問題の意味:各色の点間隔に存在するように、あなたに、n個のk個の色を与えるが、各点は、二つの座標と色属性を有する、できるだけ短い間隔の長さを選択します。
データ範囲:
データの50%、N≤10000。
データの80%、N≤800000。
データの100%、1≤N≤1000000,1≤K≤60、に0≦ ビーズ位置<2 ^ {31} 。
--------------------------------------------------私は----------------------------------------------行を分割しています---------
ソリューション:単調な足は、古典的なアプリケーションをエミュレート。一次の座標点二つの変数のLとRは、間隔を列挙するならばLにRの間隔は、要件を満たしていない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 = - 1。CH = 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 ;
}