zoukankan      html  css  js  c++  java
  • 选点(树的遍历)

    题目描述

    有一棵n个节点的二叉树,1为根节点,每个节点有一个值wi。现在要选出尽量多的点。
    对于任意一棵子树,都要满足:
    如果选了根节点的话,在这棵子树内选的其他的点都要比根节点的值
    如果在左子树选了一个点,在右子树中选的其他点要比它

    输入描述:

    第一行一个整数n。

    第二行n个整数wi,表示每个点的权值。

    接下来n行,每行两个整数a,b。第i+2行表示第i个节点的左右儿子节点。没有为0。
    n,a,b105,2×109wi2×109n,a,b≤105,−2×109≤wi≤2×109

    输出描述:

    一行一个整数表示答案。
    示例1

    输入

    复制
    5
    1 5 4 2 3
    3 2
    4 5
    0 0
    0 0
    0 0 

    输出

    复制
    3
    对树后序遍历,将权值*(-1),再跑一边LIS(或者直接找最长下降子序列)。
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5 + 10;
    int p[maxn], q[maxn], t[maxn];
    int lson[maxn], rson[maxn], cnt, len;
    void dfs(int rt) {
        if (!rt)return;
        dfs(lson[rt]);
        dfs(rson[rt]);
        q[++cnt] = p[rt]*(-1);
    }
    int main() {
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++)cin >> p[i];
        for (int i = 1; i <= n; i++) {
            int x, y;
            cin >> x >> y;
            lson[i] = x, rson[i] = y;
        }
        dfs(1);
        t[1] = q[1];
        for (int i = 2; i <= n; i++) {
            int cur = lower_bound(t + 1, t + 1 + len,q[i]) - t;
            t[cur] = q[i];
            len = max(len, cur);
        }
        cout << len << endl;
    }
  • 相关阅读:
    基本数据类型和包装数据类型
    编程英语多样化(长期更新)
    jdk,jre,jvm,openJdk
    英语句子频率印象流
    单击单选按钮换成图片
    标签注意事项:
    背景图片处理
    天猫导航栏
    百度地图
    两栏布局
  • 原文地址:https://www.cnblogs.com/czy-power/p/10356835.html
Copyright © 2011-2022 走看看