lower_bound(a,a+n,i)函数 返回从数组a到a+n中第一个>=i的元素地址
upper_bound(a,a+n,i)函数 返回从数组a到a+n中第一个>i的元素地址
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int d[maxn];
// 函数重载upper_bound函数
struct cmp
{
bool operator()(int a,int b)
{
return a>b;
}
};
int main()
{
int n=0;
while(scanf("%d", &a[++n])!=EOF);
n--;
d[1]=a[1];
int len=1;
for(int i=2; i<=n; i++)
{
if(d[len]>=a[i])
{
d[++len]=a[i];
}
else
{
int j;
j=upper_bound(d+1,d+1+len,a[i],cmp())-d;
d[j]=a[i];
}
}
printf("%d\n", len);
memset(d, 0, sizeof(d));
d[1]=a[1];
len=1;
for(int i=2; i<=n; i++)
{
if(d[len]<a[i])
{
d[++len]=a[i];
}
else
{
int j;
j=lower_bound(d+1,d+1+len,a[i])-d;
d[j]=a[i];
}
}
printf("%d\n", len);
return 0;
}