/*
nlgn lis 的简单题
*/
#include
#include
#include
using namespace std;
const int maxn = 1000000 + 10;
int data[maxn], lis[maxn], l[maxn], r[maxn];
int Find(int x, int r){
int ans = 0, l = 1;
while(l <= r){
int mid = (l + r) >> 1;
if(lis[mid] < x){
ans = mid;
l = mid + 1;
}
else r = mid - 1;
}
return ans;
}
int main(){
//freopen("in","r",stdin);
int n;
while(scanf("%d",&n) != EOF){
for(int i = 1 ;i <= n; ++ i){
scanf("%d",&data[i]);
}
int now = 1;
lis[now] = data[now];
l[1] = 1;
for(int i = 2 ;i <= n; ++ i){
if(data[i] > lis[now]){
lis[++ now] = data[i];
l[i] = now;
}
else {
int cur = Find(data[i],now);
if(lis[cur + 1] > data[i]) lis[cur + 1] = data[i];
l[i] = cur + 1;
}
}
r[n] = 1;
now = 1;
lis[now] = data[n];
for(int i = n - 1 ;i >= 1 ; -- i){
if(data[i] > lis[now]) {
lis[++now] = data[i];
r[i] = now;
}
else{
int cur= Find(data[i],now);
if(lis[cur+ 1] > data[i]) lis[cur+ 1] = data[i];
r[i] = cur + 1;
}
}
int ans = 0;
for(int i = 1 ;i <= n; ++ i){
ans = max(l[i] + r[i] - 1, ans);
}
ans = n - ans;
printf("%d\n",ans);
}
return 0;
}
九度1500
最新推荐文章于 2016-07-22 22:11:00 发布