题目链接:树的计数

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

  首先,为了方便考虑,我们可以把节点重标号,使得\(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. 【BZOJ4372】烁烁的游戏 动态树分治+线段树

    [BZOJ4372]烁烁的游戏 Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠.题意:给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠.烁烁他每次会跳到一个节点u,把周围与他距 ...

  2. ExcelUtil工具类

    import com.google.common.base.Strings;import com.jianwu.util.excel.annotation.ExcelAttribute;import ...

  3. java设计模式----外观模式(门面模式)

    外观模式主要应用场景在于为复杂的子系统提供一个简单的接口,提高子系统的独立性. 创建DrawerOne类: package facade; public class DrawerOne { publi ...

  4. undo文件丢失或损坏

    startup mount cp +DATA/ora11g/datafile/undotbs1.dbf alter database rename file '+DATA/ora11g/datafil ...

  5. kafka集群与zookeeper集群 配置过程

    Kafka的集群配置一般有三种方法,即 (1)Single node – single broker集群: (2)Single node – multiple broker集群:    (3)Mult ...

  6. python 的 ord()、 chr()、 unichr() 函数

    一. ord() 函数描述ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返 ...

  7. Scala简介及基础语法

    一.scala简介 官网:https://www.scala-lang.org/ Scala语言很强大,集成了面向对象和函数式编程的特点. 运行在JVM(jdk). 大数据中为什么学习scala? s ...

  8. 15.Git面试题

    1.git常见命令作用 git init 在哪一目录下,就会在该目录下生成.git目录. 注意:git init命令会把当前目录当作库. git status 查看本地库的状态 git add . 将 ...

  9. 10.Git远程仓库

    到目前为止,我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭,你再也不用担心文件备份或者丢失的问题了.可是有用过集中式版本控制系统SVN的童鞋会站出来说,这些功能在SVN里早就有了,没看出Git ...

  10. [Axiom 3D]3.SceneManager场景管理器

    首先看看Axiom.Core命名空间下public abstract class SceneManager : DisposableObject A SceneManager organizes th ...