牛客练习赛39 B:选点(二叉树遍历+LIS)
链接:
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)相关推荐
- 牛客练习赛39 B.选点
链接:https://ac.nowcoder.com/acm/contest/368/B 来源:牛客网 题目描述 有一棵n个节点的二叉树,1为根节点,每个节点有一个值wi.现在要选出尽量多的点. 对于 ...
- 牛客练习赛39 B 选点(dfs序+LIS)
题意: 有一棵n个节点的二叉树,1为根节点,每个节点有一个值wi.现在要选出尽量多的点. 对于任意一棵子树,都要满足: 如果选了根节点的话,在这棵子树内选的其他的点都要比根节点的值大: 如果在左子树选 ...
- 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)
title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...
- 牛客练习赛73 D 离别(线段树+右端点排序离线查询)
牛客练习赛73 D 离别 思路: 对于每一个固定的右端点i,我们都找到一个区间(l,r)使得区间中的点为左端点时 里面最大的的种数为k. 这个可以用队列或者vector来维护. 然后我们对于q个查询, ...
- 牛客网视频总结5(二叉树)
牛客网视频总结5 目录 牛客网视频总结5 二叉树先序.中序.后序遍历 递归方法 非递归方法 二叉树的后继节点/先驱节点 后继节点 前驱节点 二叉树的序列化和反序列化 判断二叉树是否为平衡二叉树(树型D ...
- 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...
- 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 牛客练习赛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 ...
- 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)
牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...
最新文章
- 牛客练习赛64 - B Dis2(树,基础图论)
- linux命令行 正则,在Linux命令行中使用正则表达式
- Android开发历程_18(XML文件解析)
- WinDbg的cmdtree命令
- 《JAVA与模式》之访问者模式
- 成功解决 编程语言代码结果中输出-9223372036854775808的数据
- 管道无损检测python_武汉哪里有便携式X射线探伤机使用方法欢迎咨询
- php键盘输入函数,php的常用输入语句以及常用函数
- Linux系统的基本法则
- 前端:JS/32/form对象(表单)(form对象的属性,方法和事件),受返回值影响的两个事件(onclick事件,onsubmit事件),获取表单的元素对象的三种方式,表单的提交和验证方法总结
- httpservletrequest_HttpServletResponse和HttpServletRequest取值的2个坑你知道吗?
- 你还不会小程序啊?手把手带你做第一个和服务器交互的小程序
- JAVA中this的四种用法的详解
- 12-静态代理设计模式-为了引出spring动态代理
- HTML+CSS实现前端网页界面案例
- win 10 设置透明图表显示为黑色方块问题
- 几个Git仓库开源软件的比较
- w ndows无法与设备或资源,windows无法与设备或资源通信怎么办
- DirectUI技术与无句柄窗口应用
- ArcGIS制作地形分析