题目链接:树的计数

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

  首先,为了方便考虑,我们可以把节点重标号,使得\(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. shell脚本分析nginx日志

    shell脚本分析nginx日志: name=`awk -F ',' '{print $13":"$32}' $file | awk -F ':' '{print $4}'`ech ...

  2. Andorid- 反序列化,采用pull解析 xml 文件

    MainActivity.java 主入口,通过获得 XML文件 ,然后将解析后的文件标签以及文本内容拼接到 StringBuffer中,最后显示在TextView上 package com.exam ...

  3. .NET截取指定长度字符超出部分以"..."代替

    /// <summary> /// 将指定字符串按指定长度进行剪切, /// </summary> /// <param name= "Str "&g ...

  4. SQL Fundamentals:替代变量(&,&&)以及DEFINE,UNDEFINE,ACCEPT指令

    替代变量 利用替代变量可以实现数据操作的交互性.替代变量的操作类似于键盘输入操作. 所谓的替代变量,指的就是在进行查询或更新操作时,某些数据是由用户所输入的,而这些数据前可以使用“&”标记. ...

  5. 使用google字体发生http://fonts.gstatic.com/s/ubuntu/v8/_aijTyevf54tkVDLy-dlnFtXRa8TVwTICgirnJhmVJw.woff2

    我在使用adminTLE后台模板时,有时候会有 http://fonts.gstatic.com/s/ubuntu/v8/_aijTyevf54tkVDLy-dlnFtXRa8TVwTICgirnJh ...

  6. ubuntu常用操作命令以及它的通道模式简解

    1.tail tail -f filename :可以动态查看文件的写入,按ctrl+c结束查看. 要显示 notes 文件的最后十行,输入: tail -n -10 notes tail notes ...

  7. 用nginx的反向代理机制解决前端跨域问题在nginx上部署web静态页面

    用nginx的反向代理机制解决前端跨域问题在nginx上部署web静态页面 1.什么是跨域以及产生原因 跨域是指a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同,或是a页面为ip地 ...

  8. hadoop2.x Federation

    单Active NN的架构使得HDFS在集群扩展性和性能上都有潜在的问题,当集群大到一定程度后,NN进程使用的内存可能会达到上百G,NN成为了性能的瓶颈 常用的估算公式为1G对应1百万个块,按缺省块大 ...

  9. Java API操作HA方式下的Hadoop

    通过java api连接Hadoop集群时,如果集群支持HA方式,那么可以通过如下方式设置来自动切换到活动的master节点上.其中,ClusterName 是可以任意指定的,跟集群配置无关,dfs. ...

  10. curl获取远程文件内容

    curl获取远程文件内容 ** 获取远程文件内容 @param $url 文件http地址 * function fopen_url($url) { if (function_exists(& ...