Day6 - 102C牛オフ

リンク: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

エントリー

コピー
2 
3 3 
1 2 3 
5 1 
1 2 2 3 3

輸出

コピー
1 
3

説明

サンプル入力の場合は、3つの区間があります。
区間[1 2 3]は値2を有する
区間[2 3]が値2いる
区間[1 2]が値1を有する
3 SO
RD
最大間隔は、その[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 
}
コードの表示
 
     

 

 
     

 

 
    

おすすめ

転載: www.cnblogs.com/GRedComeT/p/12207735.html
おすすめ