hdoj5256 序列变换(2015年百度之星程序设计大赛

来源:互联网 发布:免费微站源码 编辑:程序博客网 时间:2024/05/20 18:51

题目链接
想法题
题目要求修改后的数列严格递增,首先联想到LIS,再深入思考便列出式子:a[i]-a[j]>=i-j推出a[i]-i>=a[j]-j
具体操作:将读进来的数组处理a[i]-=i,就把问题转化为了求最长不下降子序列,复杂度O(nlogn)

#include<bits/stdc++.h>using namespace std;int main(){    int t,c,n,a[100005],i,j,l;    scanf("%d",&t);    for(c=1;c<=t;c++){        scanf("%d",&n);        for(i=1;i<=n;i++) scanf("%d",a+i),a[i]-=i;        for(l=1,i=2;i<=n;i++){            if(a[l]<=a[i]) a[++l]=a[i];            else j=upper_bound(a+1,a+1+l,a[i])-a,a[j]=a[i];        }        printf("Case #%d:\n%d\n",c,n-l);    }}
原创粉丝点击