博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
牛客练习赛9 B - 珂朵莉的值域连续段
阅读量:5992 次
发布时间:2019-06-20

本文共 1230 字,大约阅读时间需要 4 分钟。

题目描述

珂朵莉给你一个有根树,求有多少个子树满足其内部节点编号在值域上连续

一些数在值域上连续的意思即其在值域上构成一个连续的区间

输入描述:

第一行有一个整数n,表示树的节点数。 接下来n–1行,每行两个整数x,y,表示存在一条从x到y的有向边。 输入保证是一棵有根树。

输出描述:

输出一个数表示答案
示例1

输入

52 32 12 44 5

输出

5

说明

节点1子树中编号为1,值域连续 节点3子树中编号为3,值域连续 节点5子树中编号为5,值域连续 节点4子树中编号为4,5,值域连续 节点2子树中编号为1,2,3,4,5,值域连续

备注:

对于100%的数据,有n <=100000

题解

$dfs$。

只需要统计每个子树的节点数量、最小值以及最大值即可。

#include 
using namespace std;const int maxn = 200000 + 10;int n;int h[maxn], to[maxn], nx[maxn], cnt;int mn[maxn], mx[maxn], sz[maxn], in[maxn];void add(int u, int v) { to[cnt] = v; nx[cnt] = h[u]; h[u] = cnt ++;}void dfs(int x) { sz[x] = 1; mn[x] = x; mx[x] = x; for(int i = h[x]; i != -1; i = nx[i]) { dfs(to[i]); sz[x] += sz[to[i]]; mn[x] = min(mn[x], mn[to[i]]); mx[x] = max(mx[x], mx[to[i]]); }}int main() { scanf("%d", &n); for(int i = 1; i <= n; i ++) { h[i] = -1; in[i] = 0; } cnt = 0; for(int i = 1; i < n; i ++) { int u, v; scanf("%d%d", &u, &v); add(u, v); in[v] ++; } for(int i = 1; i <= n; i ++) { if(in[i] == 0) { dfs(i); } } int ans = 0; for(int i = 1; i <= n; i ++) { if(mx[i] - mn[i] + 1 == sz[i]) ans ++; } printf("%d\n", ans); return 0;}

  

转载于:https://www.cnblogs.com/zufezzt/p/8151296.html

你可能感兴趣的文章
Java【小考】
查看>>
Git异常:fatal: could not create work tree dir 'XXX': No such file or directory
查看>>
Entity Framework 6 Recipes 2nd Edition(10-7)译 -> TPH继承模型中使用存储过程
查看>>
HTML+AngularJS+Groovy如何实现登录功能
查看>>
锋利的JQuery 学习笔记
查看>>
VIM 用正则表达式,非贪婪匹配,匹配竖杠,竖线, 匹配中文,倒数第二列, 匹配任意一个字符 :...
查看>>
你误解了Windows的文件后缀名吗?
查看>>
查找不在数组里的字母
查看>>
【MongoDB】mongoimport and mongoexport of data (一)
查看>>
微软的R语言发行版本MRO及开发工具RTVS
查看>>
关于用Cocos2d-x.3.10运行别人游戏项目的步骤
查看>>
Good Teacher(模拟)
查看>>
asla架构和alsa-lib音频库的移植
查看>>
日志切换
查看>>
JS/JQ常见兼容辅助插件
查看>>
微软发布屏蔽Win10升级的官方办法
查看>>
JSP语法
查看>>
mysql 查看数据库大小
查看>>
java_内存划分
查看>>
计算机上正在运行的句柄、线程、进程分别是什么意思?
查看>>