传送门

题意:给定一棵nnn个点的树的DFS和BFS序,求树高期望。

n≤2e5n \leq 2e5n≤2e5

首先根据BFS序将树点分层,一定切记先自己把树点分层,这样实际上是在排除一部分情况。

将每一层第一个点打标记,答案就是期望标记个数。

首先BFS序第一个和第二个一定有标记。

对于之后BFS序相邻的两个,如果后面的DFS序小于前面的,说明这里分了层,给后面打上标记。

还有一个限制,DFS序相邻的两个点,后面最多比前面深一层。所以用前面的标记算出层数,如果后面大于前面,用差分实现区间修改为-1,表示一定没有标记。

而剩下的点可分可不分,贡献0.50.50.5

复杂度O(n)O(n)O(n)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#define MAXN 200005
using namespace std;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
int dfs[MAXN],bfs[MAXN],dfn[MAXN],bfn[MAXN];
int mark[MAXN],dep[MAXN],s[MAXN];
int main()
{int n=read();for (int i=1;i<=n;i++) dfn[dfs[i]=read()]=i;for (int i=1;i<=n;i++) bfn[bfs[i]=read()]=i;dep[bfs[1]]=dep[bfs[2]]=mark[bfs[1]]=mark[bfs[2]]=1;for (int i=2;i<n;i++)if (dfn[bfs[i+1]]<dfn[bfs[i]])dep[bfs[i+1]]=mark[bfs[i+1]]=1;for (int i=1;i<=n;i++) cerr<<mark[i]<<endl;     for (int i=1;i<=n;i++) dep[bfs[i]]+=dep[bfs[i-1]];for (int i=1;i<n;i++)if (dep[dfs[i]]<dep[dfs[i+1]])++s[bfn[dfs[i]]+1],--s[bfn[dfs[i+1]]+1];for (int i=1;i<=n;i++) cerr<<s[i]<<endl;for (int i=1;i<=n;i++)if ((s[i]+=s[i-1])>0&&!mark[bfs[i]])mark[bfs[i]]=-1;for (int i=1;i<=n;i++) cerr<<mark[i]<<endl;double ans=0;for (int i=1;i<=n;i++)if (mark[i]==1) ans+=1;else if (mark[i]==0) ans+=0.5;printf("%.3f",ans);return 0;
}

【NOI2013】树的计数【树的遍历】【期望】相关推荐

  1. 算法与数据结构07:前缀树,计数排序与桶排序

    算法与数据结构07:前缀树,计数排序与桶排序 前缀树 计数排序 桶排序 前缀树 Trie 1.根据字符串数组中,每个字符串的字符作为路径,组成而成的一个多叉树结构 2.每个节点都有一个paths数组, ...

  2. bzoj 1211 [HNOI2004]树的计数

    [HNOI2004]树的计数 Description 一个有n个结点的树,设它的结点分别为v1, v2, -, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, ...

  3. 树和二叉树(四种遍历,建树)详解+二叉排序树(包含图像和相关习题)

    目录 树和二叉树 一.树 2.有序树和无序树 3.森林 4.树的基本性质 二.二叉树的概念 (1)二叉树的编号 1.二叉树和度为2的有序树的区别: 2.满二叉树 3.完全二叉树: 4.平衡二叉树: 5 ...

  4. 【数据结构-树】1.树与森林(树的遍历、树的存储方法、并查集的实现)

    树的定义 树是一种数据结构,它是由 n(n>=1)n(n>=1)n(n>=1) 个有限结点组成一个具有层次关系的集合.把它叫做 "树" 是因为它看起来像一棵倒挂的 ...

  5. python回溯方法的模板_实例讲解Python基于回溯法子集树模板实现图的遍历功能

    这篇文章主要介绍了Python基于回溯法子集树模板实现图的遍历功能,结合实例形式分析了Python使用回溯法子集树模板针对图形遍历问题的相关操作技巧与注意事项,需要的朋友可以参考下 本文实例讲述了Py ...

  6. 树与图的深度优先遍历

    树与图的深度优先遍历*: 树其实也是图的一种 图: 分为有向图和无向图 图的储存: 第一种:邻接矩阵,就是一个二维数组,缺点:当点和边特别多的时候,存不下,一般用的比较少,而且非常浪费空间 第二种:邻 ...

  7. BZOJ 1211: [HNOI2004]树的计数 purfer序列

    1211: [HNOI2004]树的计数 Description 一个有n个结点的树,设它的结点分别为v1, v2, -, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给 ...

  8. 【BZOJ1211】【HNOI2004】树的计数(prufer序,组合数)

    Description 一个有n个结点的树,设它的结点分别为v1, v2, -, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, -, dn,编程需要 ...

  9. 树的基本概念和遍历规则 数据结构和算法 二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历)

    zsychanpin 博客园 首页 新随笔 联系 订阅 管理 树的基本概念和遍历规则 树的递归定义 树是n(n>0)个结点的有限集,这个集合满足下面条件:       ⑴有且仅有一个结点没有前驱 ...

  10. (伪代码)树的前中后遍历和层次遍历算法实现(考研适用,递归和非递归)

    文章目录 前言 一.递归实现树的遍历 二.非递归实现 层次遍历 总结 前言 2022考研初试结束,总结了一些考研中基本常用算法.这篇主要是关于树的前中后遍历,递归实现和非递归实现两种,现在很多自命题在 ...

最新文章

  1. 无法安装到这个磁盘 这台计算机,安装Win7提示无法安装到这个磁盘怎么办
  2. PTA数据结构与算法题目集(中文)7-45
  3. 关于安徽赛区推广校赛的实施办法
  4. linux内核内存管理的三个阶段分析
  5. Django中使用和配置Redis数据库
  6. Kuskal/Prim POJ 1789 Truck History
  7. sqrt开平方算法解析
  8. c++中的运算符异或^,与,或|
  9. android中影藏状态栏和标题栏的几种方法
  10. 判断手机机型和浏览器内核
  11. 最简单的基于时间片轮转任务调度模型
  12. jQuery学习(七)— append方法与appendTo方法
  13. c#ftp操作全解:创建删除目录,上传下载文件,删除移动文件,文件改名,文件目录查询
  14. Office 2007:另存为PDF或XPS
  15. linux如何卸载telnet命令,linux安装telnet命令
  16. 【架构师面试-大厂内部面试题-4】-MySQL 运维基础知识面试题汇总50题
  17. 元宇宙、区块链和潘家园
  18. WLAN适配器故障(消失)的最快解决办法
  19. 零拷贝、如何实现零拷贝、大文件如何传输
  20. python为什么运行不了_python怎么运行py文件

热门文章

  1. iis6 开启options方法_《王者荣耀》暗夜危机什么时候开启 暗夜危机开启时间
  2. 不同用户同时并发测压_简单聊聊吞吐量(TPS)、QPS、并发数、响应时间(RT)概念...
  3. linux脚本多线程,Shell多线程操作及线程数控制实例
  4. linux服务器出现黄,linux服务器出现严重故障后的原因以及解决方法
  5. springboot 历史版本文档_Springboot看视频学太慢?来看看这份阿里深入实践Springboot文档...
  6. scrcpy投屏_安卓投屏利器——PC一键控制多台手机
  7. harmonyos con,鸿蒙HarmonyOS系统中的JS开发框架
  8. html绑定按键图片移动,如何使用JS实现用键盘控制图片移动呢?
  9. neo4j 查询同一节点的两个上级_WhatRoute for Mac(互联网流量诊断查询工具)
  10. java ee监听器编程,java EE开发之Servlet第四课:监听器(Listener)