码迷,mamicode.com
首页 > 其他好文 > 详细

B.选点

时间:2019-02-09 19:35:02      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:cout   代码   有一个   pac   一个   int   pos   namespace   return   

链接:https://ac.nowcoder.com/acm/contest/368/B

题意:

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

思路:

题目不懂啥意思。看题解才知道,是可以任意选点。。。

直接按照中右左顺序遍历。

这样选点满足要求。

再LIS即可。

代码:

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5 + 10;

int W[MAXN];
int L[MAXN],R[MAXN];
int Res[MAXN],dp[MAXN];
int pos = 0;

void Dfs(int x)
{
    if (x == 0)
        return;
    Res[++pos] = x;
    Dfs(R[x]);
    Dfs(L[x]);
}

int main()
{
    int n;
    cin >> n;
    for (int i = 1;i <= n;i++)
        cin >> W[i];
    for (int i = 1;i <= n;i++)
        cin >> L[i] >> R[i];
    Dfs(1);
    for (int i = 1;i <= n;i++)
        Res[i] = W[Res[i]];
    pos = 1;
    dp[1] = Res[1];
    for (int i = 2;i <= n;i++)
    {
        if (Res[i] > dp[pos])
        {
            dp[++pos] = Res[i];
        }
        else
        {
            int x = lower_bound(dp + 1, dp + 1 + pos, Res[i]) - dp;
            dp[x] = Res[i];
        }
    }
    cout << pos << endl;

    return 0;
}

  

B.选点

标签:cout   代码   有一个   pac   一个   int   pos   namespace   return   

原文地址:https://www.cnblogs.com/YDDDD/p/10357756.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!