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; }