LIS的简化版。
#include<iostream> using namespace std; const int N=30005; int n; int data[N]; int stack[N]; int sp; inline void insert(int dat) { int head=1,tail=sp-1; int mid; while(head<tail) { mid=(head+tail)/2; if(stack[mid]<=dat) { head=mid+1; } else { tail=mid; } } stack[head]=dat; } void solve() { sp=1; for(int i=1;i<=n;i++) { if(data[i]>=stack[sp-1]) { stack[sp++]=data[i]; } else { insert(data[i]); } } int ans=sp-1; sp=1; for(int i=n;i>=1;i--) { if(data[i]>=stack[sp-1]) { stack[sp++]=data[i]; } else { insert(data[i]); } } if(ans>sp-1) printf("%d\n",n-ans); else printf("%d\n",n-sp+1); } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&data[i]); } solve(); return 0; }