题目链接:树的计数

  这道题好神啊……正好有人讲了这道题,那么我就写掉吧……

  首先,为了方便考虑,我们可以把节点重标号,使得\(bfs\)序变成\(1,2,3,\dots,n\),那么显然树的深度就是\(dep_n\)。

  然后,我们来考虑一下\(dfs\)序和\(bfs\)序的性质。设\(dfs\)序中的第\(i\)个点为\(d_i\),那么显然有\(dep_{d_{i+1}} \le dep_{d_i}+1\)。由于我们已经进行了重标号,那么通过\(bfs\)序,我们可以得到\(dep_i \le dep_{i+1} \le dep_i+1\)。令\(pos_i\)表示节点\(i\)在\(dfs\)序中出现的位置,那么当\(dep_i=dep_{i+1}\)时,我们可以得到\(pos_i<pos_{i+1}\)。因为我们是按照\(bfs\)序编号的,所以对于同一深度的点,越早被\(dfs\)到编号就越小。

  所以,我们建立一个数组\(s_i\),\(s_i=1\)表示\(dep_{i+1}=dep_i+1\),\(s_i=0\)表示\(dep_{i+1}=dep_i\),那么显然\(s_1=1\)。并且当\(pos_i>pos_{i+1}\)时,我们可以推出\(s_i=1\)。因为上一段中提到了,如果\(dep_i=dep_{i+1}\),则有\(pos_i<pos_{i+1}\)。

  然后,我们接着考虑\(dfs\)序的限制。如果\(d_i<d_{i+1}\),由于\(dep_{d_{i+1}}-dep_{d_i} \le 1\),我们可以得到一个式子:

\[dep_{d_{i+1}}-dep_{d_i}=\sum_{j=d_i}^{d_{i+1}-1}s_j\]

  于是我们可以得到一堆的约束条件。如果等号右边已经是\(1\)了,那么这段区间的未被确定的\(s_j\)就都是\(0\)了。在这种情况下,若\(d_i \neq 1\),则\(d_i+1<d_{i+1}\)。所以在另外一种情况下一定有\(d_i+1=d_{i+1}\),也就意味着这个条件没用了。所以剩下的未确定的变量都有可能为\(1\),而这些变量的取值和其他变量的取值无关,取到\(1\)的概率是\(0.5\),对\(dep_n\)贡献为\(0.5\)。

  最后,让我们来回顾一下算法流程:

  1.确定所有的\(s_i\)必定等于\(1\)的位置

  2.找出所有的限制条件,限制某些位置必须为\(0\)

  3.剩下的未被限制的位置对答案贡献为\(0.5\)。

  于是这道题就愉快地解决辣!(虽然我可能还是没有讲清楚)

  参考博客:戳这里

  下面贴代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 200010 using namespace std;
typedef long long llg; int d[maxn],n,a[maxn],s[maxn];
double ans; int getint(){
int w=0;bool q=0;
char c=getchar();
while((c>'9'||c<'0')&&c!='-') c=getchar();
if(c=='-') c=getchar(),q=1;
while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
return q?-w:w;
} int main(){
File("a");
n=getint(); ans=1; s[1]++,s[2]--;
for(int i=1;i<=n;i++) a[d[i]=getint()]=i;
for(int i=1;i<=n;i++) d[a[getint()]]=i;
for(int i=1;i<=n;i++) a[d[i]]=i;
for(int i=2;i<=n;i++) if(a[i]<a[i-1]) s[i-1]++,s[i]--,ans++;
for(int i=2;i<=n;i++) if(d[i-1]+1<d[i]) s[d[i-1]]++,s[d[i]]--;
for(int i=1,j=0;i<n;i++) j+=s[i],ans+=((bool)(!j))*0.5;
printf("%.3lf",ans+1);
return 0;
}

  BZOJ提交地址:BZOJ 3244 树的计数

UOJ #122 【NOI2013】 树的计数的更多相关文章

  1. [UOJ#122][NOI2013]树的计数

    [UOJ#122][NOI2013]树的计数 试题描述 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的 DFS 序以及 BFS 序.两棵不同的树的 DFS 序 ...

  2. 【BZOJ3244】【UOJ#122】【NOI2013]树的计数

    NOI都是酱的题怎么玩啊,哇.jpg 原题: 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的 ...

  3. 【uoj122】 NOI2013—树的计数

    http://uoj.ac/problem/122 (题目链接) 题意 给出一棵树的dfs序和bfs序,保证一定可以构成一棵树.问构成的树的期望深度. Solution 这是一个悲伤的故事,我YY的东 ...

  4. NOI2013 树的计数

    题目:http://uoj.ac/problem/122 85%做法: 动态规划. 首先重编号,BFS序变成1...n,然后DFS序相应重编号. 记pos[i]为i号点在DFS中的位置,即pos[d[ ...

  5. 3244: [Noi2013]树的计数 - BZOJ

    Description 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同, ...

  6. bzoj 3244: [Noi2013]树的计数

    Description 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同, ...

  7. BZOJ3244 NOI2013树的计数(概率期望)

    容易发现的一点是如果确定了每一层有哪些点,树的形态就确定了.问题变为划分bfs序. 考虑怎样划分是合法的.同一层的点在bfs序中出现顺序与dfs序中相同.对于dfs序中相邻两点依次设为x和y,y至多在 ...

  8. [BZOJ3244][NOI2013]树的计数

    这题大家为什么都写O(NlogN)的算法呢?…… 让本蒟蒻来写一个O(N)的吧…… 首先还是对BFS序和DFS序重编号,记标好的DFS序为d[1..n].令pos[x]为x在d[]中出现的位置,即po ...

  9. [bzoj3244][noi2013]树的计数 题解

    UPD: 那位神牛的题解更新了,在这里. ------------------------------------------------------------------------------- ...

  10. BZOJ3244/UOJ122 [Noi2013]树的计数

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

随机推荐

  1. JSTL的一些使用规范,坑

    三目表达式要加空格不然有些服务器解析不了 var maxBanners = ${maxBanners==null ? 3 : maxBanners}; forEach循环的长度正确使用方式 <c ...

  2. 浙江工业大学校赛 XiaoWei的战斗力

    XiaoWei的战斗力 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  3. 南京网络赛G-Lpl and Energy【线段树】

    During tea-drinking, princess, amongst other things, asked why has such a good-natured and cute Drag ...

  4. lampp and testrail

    https://wyzx.testrail.net szllq2000 http://129.0.1.228/testrail/ http://docs.gurock.com/testrail-adm ...

  5. 傅里叶变换 VS 拉普拉斯变换

    拉普拉斯变换的公式 傅里叶变换公式 拉普拉斯变换是将时域映射到s plane上,而傅里叶变换实际是将时域 映射在s-plane的虚轴上, 傅里叶变换可以看作拉普拉斯变换  的一种特例 1.推导傅里叶变 ...

  6. Git版本控制工具安装与配置

    这里太多,我写在这里方便复制: sudo yum -y install zlib-devel openssl-devel cpio expat-devel gettext-devel curl-dev ...

  7. JS对话框

    提示: alert("我是好人"); 确定,取消 if(confirm("我是好人?")){ alert("确定"); }else{ ale ...

  8. git-【三】理解工作区与暂存区的区别

    基本概念 工作区:就是你在电脑上看到的目录,比如目录下testgit里的文件(.git隐藏目录版本库除外).或者以后需要再新建的目录文件等等都属于工作区范畴.       版本库(Repository ...

  9. PAT 1110 Complete Binary Tree[判断完全二叉树]

    1110 Complete Binary Tree(25 分) Given a tree, you are supposed to tell if it is a complete binary tr ...

  10. 梅尔频率倒谱系数(MFCC) 学习笔记

    最近学习音乐自动标注的过程中,看到了有关使用MFCC提取音频特征的内容,特地在网上找到资料,学习了一下相关内容.此笔记大部分内容摘自博文 http://blog.csdn.net/zouxy09/ar ...