http://acm.hdu.edu.cn/showproblem.php?pid=5256
题目不错,题面忍不住骂一句mmp.......后面说ai都是正整数,我以为修改后也必须是正整数,前面又说只要是整数即可,所以可以修改为负数,c。。。
看起来想LIS,但是直接求a的LIS发现和答案也没有什么关系,因为要求严格递增,a[j]>a[i]--->a[j]-a[i]>=j-i---> a[j]-j>=a[i]-i
我们将ai-i处理出来找到LIS之后,因为这个ai-i数列中数不必严格递增,答案就是n-LIS
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define inf 0x3f3f3f3f 4 int main() 5 { 6 int t,n,m,i,j,k; 7 int a[100005],b[100005]; 8 cin>>t; 9 for(int cas=1;cas<=t;++cas) 10 { 11 cin>>n; 12 for(i=1;i<=n;++i) 13 { 14 scanf("%d",&a[i]); 15 a[i]-=i; 16 } 17 memset(b,inf,sizeof(b)); 18 for(i=1;i<=n;++i) 19 { 20 *upper_bound(b,b+n+1,a[i])=a[i]; 21 } 22 int ans=n-(upper_bound(b,b+n+1,inf-1)-b); 23 printf("Case #%d: %d ",cas,ans); 24 } 25 return 0; 26 }