subtask 1WA,但subtask 0全AC

B3637 最长上升子序列

cjsy18114 @ 2024-09-22 23:59:23

抱歉,稍微有点标题党。。。。。。
本人尝试用STL,发现用upper_bound时子任务1过不了,更换了lower_bound后全AC了,但不太明白为什么。请问有没有哪位大佬解释一下。
感谢!!!!!
成功AC的代码如下,失败的程序就是把里面的lower_bound替换成upper_bound

#include<bits/stdc++.h>
using namespace std;
int *a,n,*b,len;   //a数组用于存储输入数据。
int main()
{
    scanf("%d",&n);len=1;
    a=new int[n+1];b=new int[n+1];
    memset(b,0,sizeof(b));  
    //顺便问一下,动态数组能不能这样做??????
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    b[len]=a[1];
    for(int i=2;i<=n;i++)
    {
        if(a[i]>b[len])
            b[++len]=a[i];
        else
            b[lower_bound(b+1,b+len+1,a[i])-b]=a[i];
    }
    printf("%d",len);
    return 0;
}

by _Ubuntu_ @ 2024-11-05 21:37:09

@cjsy18114 进入 else 说明最后一个小于等于 a_i,你这个是查找大于 a_i 的,如果等于 a_i 的话,upper\_bound 会返回你查的区间的下一个位置。


|