最长上升子序列 nlogn;也是从别人的博客学来的
#include<iostream>
#include<algorithm>
#define maxn 100000+5
using namespace std;
int n;
int a[maxn];
int solve(int b[],int l)
{
int f[maxn];//f[i]表示子序列长度为i+1的序列中,末尾元素最小的元素的值
int k=0;
f[k++]=b[0];
for(int i=1;i<l;i++)
{
if(b[i]>=f[k-1]) f[k++]=b[i];
else
{
int pos=upper_bound(f,f+k,a[i])-f;
f[pos]=a[i];
}
}
return k;
}
int main()
{
cin.sync_with_stdio(false);
int t;
cin>>t;
int flag=1;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
a[i]=x-i;
}
int re=solve(a,n);
cout<<"Case "<<"#"<<flag++<<":"<<endl;
cout<<n-re<<endl;
}
return 0;
}