リンク:https://ac.nowcoder.com/acm/contest/102/C
出典:牛オフネットワーク
タイトル説明
我々デFiのNE間隔の値は、それの要素の最大の秒数であり、当然の間隔は、少なくとも2つの要素を持っています。
持つ配列Aを考えると
、n個の
要素と番号
K
、することができますFiのNDの値
のk
番目の
最大の間隔?
説明を入力します。
Fiの最初の行は、整数T、テストケースの数を含んでいます。
各テストケースの場合:
Fiの最初の行は、2つの整数の番号が含まれているN、K(2≤N≤10
5
、テストケースの数を、1≤K≤N(N-1)/ 2)。
第二の線が含まnは整数A
I
(1≤A
I
≤10
9
)、アレイAの要素
出力説明:
各テストケースについてのKの値を出力目
最大の間隔。
例1
説明
サンプル入力の場合は、3つの区間があります。RD
区間[1 2 3]は値2を有する
区間[2 3]が値2いる
区間[1 2]が値1を有する
3 SO
最大間隔は、その[1 2]が値1である
アイデア:k番目の最大、現在問題とPOJ3579同様の二分法次いで貪欲テストを求めて、足は、例えば、二つの要素のキューを維持するために、少なくとも2つの要素をエミュレート:
1 2 3。 4、2、3 1または2を選択し、選択し、前後は、4種類、すなわち、3または4を選択しました
typedefの長い 長いLL。 const int型 MAXM = 1E5 + 10 。 INT BUF [MAXM]、N、Q [MAXM]。 LL kを、 ブールチェック(INT X){ LL和 = 0、フロント= 0後、= 0、最後= - 1 。 以下のために(INT iが= 0、I <N; ++ I){ 場合(BUF [I]> = X)Q [フロント++] = I。 もし(フロント- >リア1 ){ 合計 + =(Q [リア] -最後)*(N - I)。 最後 = Q [後部++ ]。 } } 戻り和> = K。 } int型のmain(){ int型T。 scanf関数(" %のD "、&T)。 一方、(T-- ){ scanf関数(" %D%LLD "、&N&K)。 以下のために(INT iが= 0 ; I <N; ++ I) のscanf(" %dの"、&BUF [I])。 int型、L = 1、R =1E9、ANS、半ば。 一方、(L <= R){ 半ば =(L + R)>> 1 。 もし(チェック(MID)){ ANS = ミッド。 L =ミッド+ 1 。 } 他 R =ミッド- 1 。 } のprintf(" %dの\ n " 、ANS)。 } 戻り 0 。 }