hdu 5265

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 }
原文地址:https://www.cnblogs.com/zzqc/p/7338815.html