hdu5256 二分求LIS+思维
解题的思路很巧,为了让每个数之间都留出对应的上升空间,使a[i]=a[i]-i,然后再求LIS
另外二分求LIS是比较快的
#include<bits/stdc++.h> #define maxn 1000005 #define ll long long using namespace std; int len,n,a[maxn],lis[maxn]; int main(){ int t; scanf("%d",&t); for(int tt=1;tt<=t;tt++){ scanf("%d",&n); for(int i=1;i<=n;i++){ lis[i]=-9999999; } for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) a[i]=a[i]-i; len=0;lis[0]=a[1]; for(int i=2;i<=n;i++){ if(a[i]>=lis[len-1]) lis[len++]=a[i]; else { int pos=upper_bound(lis,lis+len,a[i])-lis; lis[pos]=a[i]; } } printf("Case #%d:\n%d\n",tt,n-len); } return 0; }