3664:Election Time

keyword

数列 2分探索 C++

概要

長さN(<5*10^4)の数列A,Bが与えられる。A[i]が上位Kに入っているようなiの中でB[i]が最大であるようなものを求める問題。
A[i]をコピーしてソートし、A[i]が上位Kに入っているかどうかは2分探索で判定すれば良い。時間計算量O(N * log N)、空間計算量O(N)。

#define MAX_N 50002

int N, K;
int as[MAX_N], bs[MAX_N], adv[MAX_N];

int solve(){
    for(int i=0; i<N; i++){
        adv[i] = as[i];
    }
    sort(adv, adv+N, greater<int>());
    int ma = -1, key = -1;
    for(int i=0; i<N; i++){
        if(ma < bs[i] && binary_search(adv,adv+K,as[i],greater<int>())){
            ma = bs[i];
            key = i;
        }
    }
    return key + 1;
}