题目就是求一次最长不下降子序列和最长不上升子序列
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define debug(x) cerr<<#x<<"="<<x<<endl;
const int maxn = 300010;
int n, a[maxn], f[maxn], g[maxn],ans,len,ren;
int seach (int l, int r, int x) {
int rec;
while(l <= r) {
int mid = l+r>>1;
if(f[mid] > x) {
rec = mid;
r = mid-1;
}
else
l = mid+1;
}
return rec;
}
int seach1 (int l, int r, int x) {
int rec;
while(l <= r) {
int mid = l+r>>1;
if(g[mid] < x) {
rec = mid;
r = mid-1;
}
else
l = mid+1;
}
return rec;
}
int main() {
cin >> n;
for(int i=1; i<=n; i++)
cin >> a[i];
for(int i=1; i<=n; i++) {
if(a[i] >= f[len])
f[++len] = a[i];
else {
int l = seach(1,len,a[i]);
f[l] = a[i];
}
}
g[0] = 0x7fffffff;
for(int i=1; i<=n; i++) {
if(a[i] <= g[ren]){
g[++ren] = a[i];
}
else {
int l = seach1(1,ren,a[i]);
g[l] = a[i];
}
}
printf("%d",n - max(ren,len));
return 0;
}