您的位置:首页 > 其它

改造二叉树(lis+中序遍历)

2017-10-25 15:17 169 查看
#include<iostream>

#include<cstdio>

#include<cstring>

#include<algorithm>

#include<cmath>

using namespace std;

const int maxn=1e5+10;

int n,cnt,num[maxn],len,a[maxn],fa[maxn],l[maxn],r[maxn],dp[maxn];

void dfs(int x){

    if(x==0) return ;

    dfs(l[x]);

    num[++cnt]=a[x];

    dfs(r[x]);

}

int main(){

    scanf("%d",&n);

    for(int i=1;i<=n;i++) scanf("%d",&a[i]);

    int x,y;

    for(int i=2;i<=n;i++){

        scanf("%d%d",&x,&y); fa[i]=x;

        if(y==0) l[x]=i;

        else r[x]=i;

    }

    dfs(1);

    for(int i=1;i<=cnt;i++) num[i]-=i;

    for(int i=1;i<=cnt;i++){

        if(num[i]>dp[len]) dp[++len]=num[i];

        else dp[lower_bound(dp+1,dp+1+len,num[i])-dp]=num[i];

    }

    cout<<n-len<<endl;

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: