Description
N<=10^5
Solution
显然,对于每一个
ai
,都必定从一个
ak
转移而来,并且
k<i,ak=ai−1
那么
xk<xi
因为我们要尽量让前面的
x
比后面的大,
所以每一个
所以对于任意一个
i
,它最优的
那么
k
向
Code
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
#define N 100005
#define LL long long
using namespace std;
int n,m,a[N],l[N],d[N],lt[N],nt[N],dt[N],m1,x[N],v;
void dfs(int k)
{
x[k]=v++;
for(int i=lt[k];i;i=nt[i]) dfs(dt[i]);
}
void link(int x,int y)
{
nt[++m]=lt[x];
dt[lt[x]=m]=y;
}
int main()
{
cin>>n;
int m=0;
LL ans=0;
fo(i,1,n)
{
scanf("%d",&a[i]);
link(l[a[i]-1],i);
l[a[i]]=i;
}
dfs(0);
memset(d,107,sizeof(d));
d[0]=0;
fod(i,n,1)
{
int p=lower_bound(d,d+n+1,x[i])-d;
ans+=(LL)p;
d[p]=min(d[p],x[i]);
}
printf("%lld\n",ans);
}