hdu 序列变换

来源:互联网 发布:星星知我心演员 编辑:程序博客网 时间:2024/06/07 07:11




序列变换我们需要的是一个修改以后的最长递增子序列
因为修改的数只能是整数
所以我们的还要考虑数是否可以修改
我们对所有输入的数减去i也就是他们的位置
这样我们就只需要求最长非递减子序列即可
n的时间复杂度太罗嗦了
我们log(n)的还好说。。、
正常的最长递增子序列是利用stl 函数的lower_bound
这里我们要的是非递减子序列
用upper_bound即可
stl的upper的应用
#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>using namespace std;int a[100003];int b[100003];int solve(int n){    int s=0;    b[++s]=a[0];    for(int i=1;i<n;i++)    {        if(a[i]>=b[s])            b[++s]=a[i];        else        {            int z=upper_bound(b+1,b+s,a[i])-b;            b[z]=a[i];        }    }    return s;}int main(){    int T;    scanf("%d",&T);    int time=0;    while(T--)    {        int n;        scanf("%d",&n);        for(int i=0;i<n;i++)        {            scanf("%d",&a[i]);            a[i]-=i;        }        int ans=n-solve(n);        printf("Case #%d:\n",++time);        printf("%d\n",ans);    }}
如果还想看类似的题可以点开
here

B - 序列变换

 

0 0