链接:

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

来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

有一棵n个节点的二叉树,1为根节点,每个节点有一个值wiw_iwi​。现在要选出尽量多的点。

对于任意一棵子树,都要满足:

如果选了根节点的话,在这棵子树内选的其他的点都要比根节点的值

如果在左子树选了一个点,在右子树中选的其他点要比它

输入描述:

第一行一个整数n。第二行n个整数wiw_iwi​,表示每个点的权值。
接下来nnn行,每行两个整数a,ba,ba,b。第i+2i+2i+2行表示第iii个节点的左右儿子节点。没有为000。
n,a,b≤105,−2×109≤wi≤2×109n,a,b≤10^5,−2×10^9≤w_i≤2×10^9n,a,b≤105,−2×109≤wi​≤2×109

输出描述:

一行一个整数表示答案。

输入

5
1 5 4 2 3
3 2
4 5
0 0
0 0
0 0

输出

3

Solve

题目要求选出来的点满足:左儿子权值>右儿子权值>父亲权值。对二叉树进行后续遍历,可以得到左儿子->右儿子->父亲的排列,然后对遍历得到的结果反向求LIS即可

Code

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ms(a,b) memset(a,b,sizeof(a))
#define INF 0x7f7f7f7f
const int maxn=1e5+10;
const int mod=1e9+7;
using namespace std;
int w[maxn];
int arr[maxn];
int ar[maxn];
int dp[maxn];
struct wzy
{int l,r;
}p[maxn];
int cnt;
void get_arr(int x)
{if(p[x].l)get_arr(p[x].l);if(p[x].r)get_arr(p[x].r);arr[cnt++]=w[x];
}
int main(int argc, char const *argv[])
{ios::sync_with_stdio(false);cin.tie(0);ms(p,0);int n,a,b;cin>>n;for(int i=1;i<=n;i++)cin>>w[i];for(int i=1;i<=n;i++){cin>>a>>b;p[i].l=a;p[i].r=b;}get_arr(1);for(int i=0;i<cnt;i++)ar[cnt-i-1]=arr[i];int len=0;for(int i=0;i<n;i++){int pos=upper_bound(dp,dp+len,ar[i])-dp;dp[pos]=ar[i];len=max(len,pos+1);}cout<<len<<endl;return 0;
}

转载于:https://www.cnblogs.com/Friends-A/p/11054971.html

牛客练习赛39 B:选点(二叉树遍历+LIS)相关推荐

  1. 牛客练习赛39 B.选点

    链接:https://ac.nowcoder.com/acm/contest/368/B 来源:牛客网 题目描述 有一棵n个节点的二叉树,1为根节点,每个节点有一个值wi.现在要选出尽量多的点. 对于 ...

  2. 牛客练习赛39 B 选点(dfs序+LIS)

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

  3. 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)

    title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...

  4. 牛客练习赛73 D 离别(线段树+右端点排序离线查询)

    牛客练习赛73 D 离别 思路: 对于每一个固定的右端点i,我们都找到一个区间(l,r)使得区间中的点为左端点时 里面最大的的种数为k. 这个可以用队列或者vector来维护. 然后我们对于q个查询, ...

  5. 牛客网视频总结5(二叉树)

    牛客网视频总结5 目录 牛客网视频总结5 二叉树先序.中序.后序遍历 递归方法 非递归方法 二叉树的后继节点/先驱节点 后继节点 前驱节点 二叉树的序列化和反序列化 判断二叉树是否为平衡二叉树(树型D ...

  6. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...

  7. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  8. 牛客练习赛34 E little w and Digital Root(数位dp)

    title: 牛客练习赛34 E little w and Digital Root(数位dp) date: 2018-12-17 22:38:37 tags: 数位dp categories:ACM ...

  9. 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)

    牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...

最新文章

  1. 牛客练习赛64 - B Dis2(树,基础图论)
  2. linux命令行 正则,在Linux命令行中使用正则表达式
  3. Android开发历程_18(XML文件解析)
  4. WinDbg的cmdtree命令
  5. 《JAVA与模式》之访问者模式
  6. 成功解决 编程语言代码结果中输出-9223372036854775808的数据
  7. 管道无损检测python_武汉哪里有便携式X射线探伤机使用方法欢迎咨询
  8. php键盘输入函数,php的常用输入语句以及常用函数
  9. Linux系统的基本法则
  10. 前端:JS/32/form对象(表单)(form对象的属性,方法和事件),受返回值影响的两个事件(onclick事件,onsubmit事件),获取表单的元素对象的三种方式,表单的提交和验证方法总结
  11. httpservletrequest_HttpServletResponse和HttpServletRequest取值的2个坑你知道吗?
  12. 你还不会小程序啊?手把手带你做第一个和服务器交互的小程序
  13. JAVA中this的四种用法的详解
  14. 12-静态代理设计模式-为了引出spring动态代理
  15. HTML+CSS实现前端网页界面案例
  16. win 10 设置透明图表显示为黑色方块问题
  17. 几个Git仓库开源软件的比较
  18. w ndows无法与设备或资源,windows无法与设备或资源通信怎么办
  19. DirectUI技术与无句柄窗口应用
  20. ArcGIS制作地形分析

热门文章

  1. ejs模板引擎的使用
  2. 任意长度的字典生成算法
  3. 老赵谈IL(3):IL可以看到的东西,其实大都也可以用C#来发现
  4. 64位系统下使用ODP.NET 11g的异常
  5. linux系统配置之开机启动过程(centos)
  6. Linux curl API 使用 C语言
  7. Debian 下通过Bonding 实现双网卡单IP
  8. 给PHPSTORM添加XDEBUG调试功能
  9. error LNK2001: 无法解析的外部符号 public: static int Pe...
  10. 超酷的JS时间效果--收集