百题计划-5 codeforces 651 div2 D. Odd-Even Subsequence 二分检查

https://codeforces.com/contest/1370/problem/D

二分检查

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
const int maxn=200100;
const int INF=(1LL<<30);
const ll MOD=1e9+7;

int n,k;
int a[maxn];
/**
奇数位 from 1
    k%2==0,不能取n

偶数位 from 2
    k%2==1,不能取n
*/

bool check_odd(int m){
    int cnt=(k+1)/2;
    int last=0;
    for(int i=1;i<=n;i++){
        if(a[i]<=m) cnt--,last=i,i++;
        if(cnt==0) break;
    }
    if(cnt==0){
        if(k%2==0) return last!=n;
        return 1;
    }
    return 0;
}

bool check_even(int m){
    int cnt=k/2;
    int last=0;
    for(int i=2;i<=n;i++){
        if(a[i]<=m) cnt--,last=i,i++;
        if(cnt==0) break;
    }
    if(cnt==0){
        if(k%2) return last!=n;
        return 1;
    }
    return 0;
}

bool check(int m){
    return check_odd(m) || check_even(m);
}

int bin(int l,int r){
    if(k==1) return l;
    int res=r;
    while(l<=r){
        int m=(l+r)>>1;
        if(check(m)) res=min(res,m),r=m-1;
        else l=m+1;
    }
    return res;
}

int main(){
    while(cin>>n>>k){
        int max_a=0,min_a=MOD;
        for(int i=1;i<=n;i++) cin>>a[i],max_a=max(max_a,a[i]),min_a=min(min_a,a[i]);
        cout<<bin(min_a,max_a)<<endl;
    }
    return 0;
}
View Code

 

posted on 2020-08-21 21:01  KEZ  阅读(133)  评论(0)    收藏  举报

导航