D. Odd-Even Subsequence

题意: 对于数列 a , 找出数列的子序列 s , 使得 $min(max(s_1, s_3, s_5, \ldots), max(s_2, s_4, s_6, \ldots))$ 最小。

input

1
2
6 4
5 3 50 2 4 5

output

1
3

首先,奇偶交替是一定的,所以可以选择一个奇下标元素后再选择偶的。

假定最小元素在奇序列中,

二分答案,遍历原序列 a,观察是否可以组成长度 > k 满足所有元素都小于 x 的子序列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
int n,k,a[MAX],l=INF,r=0,ans;
bool f(int x,int flag){
int cnt=0;
fi(i,0,n){
if(flag){
cnt ++;
flag = 0;
}else {
if(a[i]<=x){
cnt ++;
flag=1;
}
}
}
return cnt >= k;
}
int main(){
//freopen("in","r",stdin);
sf(n);sf(k);
fi(i,0,n) {
sf(a[i]);
l = min(l,a[i]);
r = max(r,a[i]);
}
while(l<=r){
int m = (l+r)/2;
if(f(m,0) || f(m,1)){
ans = m;
r = m-1;
}else {
l = m+1;
}
}
pf(ans);
return 0;
}