正题

题目链接:https://www.luogu.com.cn/problem/P1232


题目大意

给出nnn个点的树的dfsdfsdfs序和bfsbfsbfs序,求所有合法的树的平均深度。

1≤n≤2×1051\leq n\leq 2\times 10^51≤n≤2×105


解题思路

bfsbfsbfs应该是最好开始考虑的,因为bfsbfsbfs序的深度肯定是递增的,所以可以把bfsbfsbfs序分成若干段相同深度的段,注意到dfsdfsdfs序对bfsbfsbfs序的限制是在同一层内的dfsdfsdfs序一定要递增。

记bib_ibi​表示排在bfsbfsbfs序的第iii个对应的dfsdfsdfs序,那么如果bi>bi+1b_i>b_{i+1}bi​>bi+1​那么处于iii位置的节点就必须要分层,其他都可以选择分不分层。

然后再考虑dfsdfsdfs序的其他限制,考虑dfsdfsdfs序上相邻的节点,记aia_iai​表示排在dfsdfsdfs序的第iii个对应的bfsbfsbfs序。

此时如果ai>ai+1a_i>a_{i+1}ai​>ai+1​那么显然iii没有儿子并且dfsdfsdfs序直接跳到了其祖先的某个儿子处,不受影响。如果ai+1=ai+1a_i+1=a_{i+1}ai​+1=ai+1​那么此时i+1i+1i+1既可能在iii的同层也可能在iii的下一层,但是如果ai+1<ai+1a_{i}+1<a_{i+1}ai​+1<ai+1​那么在ai+1a_{i+1}ai+1​之前不可能分层,因为如果分了那么肯定会优先dfsdfsdfs下一层的节点,所以只有可能是bfsbfsbfs位于ai∼ai+1−1a_i\sim a_{i+1}-1ai​∼ai+1​−1的在同一层。

然后剩下的节点都是既可以分层也可以不分层的,这些点会产生0.50.50.5的贡献。

时间复杂度:O(n)O(n)O(n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10;
int n,a[N],b[N],A[N],B[N],s[N],ans;
int main()
{scanf("%d",&n);ans=4;s[1]=1;s[2]=-1;for(int i=1;i<=n;i++)scanf("%d",&a[i]),A[a[i]]=i;for(int i=1;i<=n;i++)scanf("%d",&b[i]),B[b[i]]=i;for(int i=1;i<=n;i++)a[i]=B[a[i]],b[i]=A[b[i]];for(int i=1;i<n;i++)if(a[i]+1<a[i+1])s[a[i]]++,s[a[i+1]]--;for(int i=1;i<n;i++)if(b[i]>b[i+1])s[i]++,s[i+1]--,ans+=2;for(int i=1,k=0;i<n;i++)k+=s[i],ans+=k?0:1;printf("%.3lf\n",ans/2.0);return 0;
}

P1232-[NOI2013]树的计数【思维】相关推荐

  1. P1232 [NOI2013] 树的计数

    -调半天别的东西写错了,心力交瘁. 思路还是不会.. 具体就是二分,没想到,然后再贪心. 一直没整明白一个数它要往别的树走的条件是什么,日后研究. #include <iostream> ...

  2. BZOJ 3244: [Noi2013]树的计数

    传送门 神仙题... 和树的深度有关,由于 $BFS$ 序的性质,显然可以通过把 $BFS$ 序分成若干段来求出深度,每一段就对应某一深度从左到右的所有节点,那么如果确定了分的段数就确定了树的深度(分 ...

  3. [NOI2013]树的计数

    // luogu-judger-enable-o2 /* 考虑将bfs序按层分段, 每分一段就会使深度+1,所以分的段数+1就是深度 由于每种分段方式至多只能对应一种dfs序, 所以我们的目标就是求出 ...

  4. BZOJ3244 [Noi2013]树的计数 【数学期望 + 树遍历】

    题目链接 BZOJ3244 题解 不会做orz 我们要挖掘出\(bfs\)序和\(dfs\)序的性质 ①容易知道\(bfs\)序一定是一层一层的,如果我们能确定在\(bfs\)序中各层的断点,就能确定 ...

  5. bzoj 1211 [HNOI2004]树的计数

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

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

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

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

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

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

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

  9. 项目管理树状组织结构思维导图怎样绘制

    思维导图的种类是很多的,不同的主题要选择不同的框架结构以及绘制方法,这样有利于洪作的进行,并且熟练掌握不同结构思维导图的绘制可以对让我们在学到不同的知识点,下面是分享的项目管理树状组织结构思维导图的绘 ...

  10. 数据结构-树与二叉树-思维导图+小结

    数据结构-树与二叉树-思维导图 1 数据结构-第五章-树与二叉树-思维导图 2 思维导图-补充 3 小结 3.1 知识点小结 3.2 习题小结 1 数据结构-第五章-树与二叉树-思维导图   数据结构 ...

最新文章

  1. C primer plus -- Chapter 2
  2. Hyperledger fabric1.4.0搭建环境
  3. Linux虚拟机安装及与宿主机相互通信
  4. 每天一道LeetCode-----判断给定字符串是否符合某个模式
  5. python元类_python中的元类 metaclass
  6. python中数字和字符串可以直接相加_用c语言或者python将文件中特定字符串后面的数字相加...
  7. windows10 网络热点
  8. 最近我一个朋友在职场上陷入了迷茫
  9. zabbix node.js mysql_Zabbix添加Node.js监控的方法
  10. python bytes_Python每天必学之bytes字节
  11. 从第一范式(2nf)到第二范式(3nf)_关系数据模型-范式
  12. PHP 面试知识点整理归纳
  13. 二维图形编辑系统c语言实现,实验四01二维图形的几何变换.doc-资源下载在线文库www.lddoc.cn...
  14. mysql 段错误 (core dumped)_CentOS yum 段错误 (core dumped)解决办法
  15. win10版本的共享网络,以及HP LaserJet 1020的共享打印机总结
  16. 批量去除PDF的水印(完全免费)
  17. vue移动端下拉刷新组件、上拉加载组件
  18. Java Web框架简介
  19. 网络 :基础——路由器、交换机
  20. Unity实现加载文件夹内所有图片并可显示和放大的一种解决方案

热门文章

  1. 《SAS编程与数据挖掘商业案例》学习笔记之十八
  2. linux安装toncat环境变量,linux下JDK,tomcat的安装与环境变量配置
  3. linux 创建ll,两台linux建立GRE隧道
  4. 计算机表演赛新疆赛区,【图】第二十六届中国儿童青少年威盛中国芯HTC计算机表演赛“中国电信天翼杯”新疆赛区总决赛圆满结束_乌鲁木齐教育信息网...
  5. linux提升权限命令提示符,win10如何直接使用命令提示符提高管理员权限?
  6. anjularjs ajax 调用,AngularJS AJAX调用的服务(AngularJS Ajax Call in Service
  7. cheatengine找不到数值_彩票中奖500万,领了还不到一半?这些问题不解决,钱都拿不走...
  8. 122. 买卖股票的最佳时机 II008(贪心算法+思路)
  9. webpack实战之手写一个loader和plugin
  10. C++vector容器-容量和大小