1370D - Odd-Even Subsequence
题意:
可以在长度为N的数组中任选K个元素组成一个新的数组,设这个新的数组中下标为奇数的元素中的最大值为K1,下标为偶数的元素中的最大值为K2,求MIN(K1,K2)
思路:
已知 1≤ai≤1e9
,使用二分来寻找一个值X,这个X能够使得在选择了长度>=K的新数组后,在这个新数组中的下标为奇数(或者偶数)的所有元素的最大值<=X
代码附:
#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5+10;
int n,k;
int a[N];
bool check(int x,bool cur)
{
int cnt=0;
for(int i=1; i<=n; ++i)
{
if(cur)
{
cur^=1;
cnt++;
}
else if(a[i]<=x)
{
cnt++;
cur^=1;
}
}
return cnt>=k;
}
int two()
{
int L=1,R=1e9;
while(L<R)
{
int mid=(L+R)>>1;
if(check(mid,0)||check(mid,1))
R=mid;
else
L=mid+1;
}
return L;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>k;
for(int i=1; i<=n; ++i)
cin>>a[i];
int ans=two();
cout<<ans;
return 0;
}