D. Odd-Even Subsequence
https://codeforces.com/contest/1370/problem/D
题意:给定一个序列,让我们找一个大小为k的序列,求最小值
最小值的定义为:min(奇数位置上的最大,偶数位置上的最小)
思路:二分
对于check部分,我们分为两块来写,奇数位和偶数位
先考虑奇数位置,我们找出满足奇数位置的个数和偶数位置的个数
计算完毕后再比较,不成功的话再转向偶数位的计算,成功就直接跳出
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=2e5+10; 4 int a[maxn]; 5 int n,k; 6 int limitodd,limiteven; 7 int check(int mid) 8 { 9 //先看奇数; 10 int flag=1; 11 int numodd=0; 12 int numeven=0; 13 for(int i=1;i<=n;i++){ 14 if(flag==1){ 15 if(a[i]<=mid){ 16 numodd++; 17 flag=0; 18 } 19 } 20 else{ 21 numeven++; 22 flag=1; 23 } 24 } 25 if(numodd>=limitodd&&numeven>=limiteven) return 1; 26 else{ 27 numodd=1; 28 numeven=0; 29 flag=1; 30 for(int i=2;i<=n;i++){ 31 if(flag==1){ 32 if(a[i]<=mid){ 33 numeven++; 34 flag=0; 35 } 36 } 37 else{ 38 numodd++; 39 flag=1; 40 } 41 } 42 if(numodd>=limitodd&&numeven>=limiteven) return 1; 43 else return 0; 44 } 45 } 46 int main() 47 { 48 scanf("%d%d",&n,&k); 49 limiteven=k/2; 50 limitodd=k/2+k%2; 51 for(int i=1;i<=n;i++) 52 scanf("%d",&a[i]); 53 int L=1,R=1e9; 54 int ans; 55 while(L<=R){ 56 int mid=L+R>>1; 57 if(check(mid)){ 58 ans=mid; 59 R=mid-1; 60 } 61 else L=mid+1; 62 } 63 printf("%d\n",ans); 64 return 0; 65 }