Link:

传送门

A:

套路题结果想了好久……

排序二叉树的性质就是中序遍历单调递增

于是只考虑当前树的中序遍历的序列即可,与树的形态无关

 

将序列改成严格单调增想到最大化不变的数,但直接LIS求的是改为非严格单调增的数

一个将严格单调增问题改为非严格的套路是将数$a_i$替换成$a_i-i$,对转换后序列求LIS即可

(其实也可以理解为在严格单增问题中能拓展的条件为$a[i]-a[k]\ge i-k$,那么也就是$a[i]-i\ge a[k]-k$)

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=2e5+10;
ll dat[MAXN],ind[MAXN],tot;
int n,x,y,ch[MAXN][2],dp[MAXN],res;

void dfs(int x)
{
    if(~ch[x][0]) dfs(ch[x][0]);
    ind[++tot]=dat[x];
    if(~ch[x][1]) dfs(ch[x][1]);
}

int main()
{
    scanf("%d",&n);
    memset(ch,-1,sizeof(ch));
    for(int i=1;i<=n;i++) 
        scanf("%lld",&dat[i]);
    for(int i=1;i<n;i++)
        scanf("%d%d",&x,&y),ch[x][y]=i+1;
    dfs(1);dp[0]=-1<<30;
    
    for(int i=1;i<=n;i++) ind[i]-=i;
    for(int i=1;i<=n;i++)
    {
        if(ind[i]>=dp[res]) dp[++res]=ind[i];
        else dp[upper_bound(dp+1,dp+res+1,ind[i])-dp]=ind[i];
    }
    printf("%d",n-res);
    return 0;
}
Problem A

相关文章:

  • 2021-08-28
  • 2021-08-18
  • 2021-10-02
  • 2021-08-19
  • 2022-12-23
  • 2021-04-18
  • 2021-07-06
猜你喜欢
  • 2021-11-10
  • 2021-11-29
  • 2021-06-08
  • 2022-03-08
  • 2021-08-09
  • 2022-02-13
  • 2021-10-07
相关资源
相似解决方案