解题思路
如同求最长不上升子序列
下文是最长不上升
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
ll n,ans,tree[2000020],f[2000020];
struct c{
ll x,y;
}a[2000020];
bool cmp(const c&l, const c&r)
{
if(l.x==r.x) return l.y<r.y;
return l.x>r.x;
}
void add(ll x,ll c)
{
for(int i=x;i<=n;i+=i&(-i))
tree[i]=max(tree[i],c);
}
ll find(ll x)
{
ll ans=0;
for(int i=x;i;i-=i&(-i))
ans=max(ans,tree[i]);
return ans;
}
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i].x);
a[i].y=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
f[i]=find(a[i].y)+1;
add(a[i].y,f[i]);
}
for(int i=1;i<=n;i++)
ans=max(ans,f[i]);
printf("%lld",ans);
}