题目描述![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/05db5fd30e7ee9af1445e2cb181d976e.png)
思路:
和这道题基本一样,只是编号倒过来而已
c o d e code code
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n;
long long c[201110], dp[201110];
struct node
{
long long x, id;
}a[201110];
bool cmp(node x, node y)
{
if(x.x!=y.x)
return x.x<y.x;
else return x.id<y.id;
}
long long lowbit(long long x)
{
return x&-x;
}
void add(long long x, long long y)
{
for(; x<=201010; x+=lowbit(x))
c[x]=max(c[x], y);
}
long long query(long long x)
{
long long ans=0;
for(; x; x-=lowbit(x))
ans=max(ans, c[x]);
return ans;
}
int main()
{
scanf("%lld", &n);
for(long long i=1; i<=n; i++)
scanf("%lld", &a[n-i+1].x), a[n-i+1].id=n-i+1, c[i]=0;
sort(a+1, a+n+1, cmp);
for(long long i=1; i<=n; i++)
{
dp[i]=query(a[i].id)+1;
add(a[i].id, dp[i]);
}
long long ans=1;
for(long long i=1; i<=n; i++)
ans=max(ans, dp[i]);
printf("%lld", ans);
return 0;
}