hdu5256 二分求LIS+思维

时间:2023-03-09 03:06:42
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=;tt<=t;tt++){
scanf("%d",&n);
for(int i=;i<=n;i++){
lis[i]=-;
}
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++) a[i]=a[i]-i;
len=;lis[]=a[];
for(int i=;i<=n;i++){
if(a[i]>=lis[len-]) 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 ;
}