百题计划-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; }
浙公网安备 33010602011771号