そして、非常に多くの展覧会を訪れたような、場所ごとに異なっているがOKに存在する......構造のいくつかのビーズで片付けることができます
最初の書き込みキュー構造の種類、使いやすい〜予期しません!
タイトル説明
小西はリボンが着色ビーズの様々なハング、長いリボンの上に持っていました。ビーズはK種に、Nで知られています。簡潔には、リボンは、に対応する座標ビーズ(すなわち、位置)のそれぞれ、x軸と見なすことができます。ビーズは、いくつかの時間を調整することはできませんが、いくつかのビーズは、同じ位置に表示されます。
ブッシュ大統領の誕生日が来ているので、小さな西は少し布のためにいくつかのリボンをカットしていきます。かなり十分なギフトのリボンを作るために、小西はこの段落のリボンはビーズのすべての種類を含めることができます願っています。一方、便宜上、小西はこのリボンは、あなたが小西はそれの最短長さを計算することができ、可能な限り短く願っていますか?リボンは、位置差の終了位置までリボン長開始位置です。
入力形式
最初の行は、2つの整数N、Kを含み、総数と着色ビーズの種類の数を表します。最初の番号の次のK線はTiで、私は、着色されたビーズの種類の数を表します。次に、Tiが所定の非負整数、Tiは、それぞれのビーズに見える場所を昇順。
出力フォーマット
出力ライン、最短リボンの長さを含むべきです。
サンプル入力と出力
6 3
1 5
2 1 7
3 1 3 8
説明/ヒント
[サンプル記述]
1-5と5-8比較的短い多くの代替スキームがあります。後者の3最短。
[データ]スケール
データの50%、N≤10000。
データの80%、N≤800000。
データ、1≤N≤1000000,1≤K≤60、100%に0 ≤ビーズ位置に<2 31です。
ΣT I = N。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 構造体ノード{ int型のPOS、種類; }。 INTの N、M、T、K、LEN、ANS = INT_MAX、合計。 ノード[ 1000050 ]。 int型の M [ 1000050 ]。 int型 CMP(ノードX、ノードY){ 戻り x.pos < y.pos;} int型のmain() { キュー <ノード> Q。 scanf関数(" %d個の%のD "、&N、&M)。 // 珠子总数和种类数 について(int型 I = 1 ;私は= Mを<;私++){ scanf関数(" %のD "、&T)。 用(INTの J = 1 ; J <= T; J ++ ){ CIN >> [++ LEN] .POS。 [LEN] .kind = I。 } } ソート(A + 1、A + N + 1 、CMP)。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ q.push([I])。 M [i]は.kind] ++ ; もし(M [i]は.kind] == 1)合計++ 。 しばらく(合計==M){ ノードE = q.back()、S = q.front(); // 右エンドポイントと左エンドポイント IF(ANS> e.pos-S.POS)ANS = e.pos- S.POS; Q .pop(); M [s.kind] - ; IF(mは[s.kind] == 0)sum-- ; } } COUT << ANS; }