思路:貌似题目就是思路,要一个序列修改最少的个数使其变得严格递增,对于a[i]-a[j]>=i-j,(i>j),那么对于a[i],变成a[i]-i,再求最长递增子序列,n-去
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10; 4 5 int a[N]; 6 int b[N]; 7 int n; 8 9 int search(int x,int L,int R){ 10 // cout<<x<<" "<<L<<" "<<R<<endl; 11 int y=x,l=L,r=R,mid,ans; 12 while(l<=r){ 13 mid=(l+r)>>1; 14 // cout<<mid<<endl 15 if(b[mid]>x){ 16 ans=mid; 17 r=mid-1; 18 } 19 else l=mid+1; 20 } 21 return ans; 22 } 23 int hh(){ 24 b[1]=a[1]; 25 int len=1; 26 for(int i=2;i<=n;i++){ 27 if(a[i]>=b[len]){ 28 len++; 29 b[len]=a[i]; 30 } 31 else { 32 int k=search(a[i],1,len); 33 //cout<<endl; 34 b[k]=a[i]; 35 } 36 } 37 return len; 38 } 39 40 int main(){ 41 int t ; 42 int kk=1; 43 44 scanf("%d",&t); 45 while(t--){ 46 scanf("%d",&n); 47 for(int i=1;i<=n;i++) { 48 scanf("%d",&a[i]);a[i]-=i; 49 } 50 printf("Case #%d:\n%d\n",kk++,n-hh()); 51 } 52 return 0; 53 } 54 /* 55 5 56 5 57 0 1 1 2 3 58 */
题目不是说每个都是正整数嘛
原文:http://www.cnblogs.com/hhxj/p/7241524.html