Description

我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序。两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同,例如下面两棵树的DFS序都是1 2 4 5 3,BFS序都是1 2 3 4 5

现给定一个DFS序和BFS序,我们想要知道,符合条件的有根树中,树的高度的平均值。即,假如共有K棵不同的有根树具有这组DFS序和BFS序,且他们的高度分别是h1,h2,...,hk,那么请你输出
(h1+h2..+hk)/k
Input

有3行。
第一行包含1个正整数n,表示树的节点个数。
第二行包含n个正整数,是一个1~n的排列,表示树的DFS序。
第三行包含n个正整数,是一个1~n的排列,表示树的BFS序。
输入保证至少存在一棵树符合给定的两个序列。
Output

仅包含1个实数,四舍五入保留恰好三位小数,表示树高的平均值。
Sample Input

5
1 2 4 5 3
1 2 3 4 5

Sample Output
3.500
HINT

【评分方式】

如果输出文件的答案与标准输出的差不超过0.001,则将获得该测试点上的分数,否则不得分。

【数据规模和约定】

20%的测试数据,满足:n≤10;

40%的测试数据,满足:n≤100;

85%的测试数据,满足:n≤2000;

100%的测试数据,满足:2≤n≤200000。

【说明】

树的高度:一棵有根树如果只包含一个根节点,那么它的高度为1。否则,它的高度为根节点的所有子树的高度的最大值加1。

对于树中任意的三个节点a , b , c ,如果a, b都是c的儿子,则a, b在BFS序中和DFS序中的相对前后位置是一致的,即要么a都在b的前方,要么a都在b的后方。

Orz两位神犇的题解http://www.cnblogs.com/g-word/p/3288675.html

http://www.cnblogs.com/lazycal/p/bzoj-3244.html

我太弱了,你们还是看他们两个的吧,他们讲的还是比较清楚的

 const
maxn=;
type
node=record
lc,rc,l,r,min:longint;
end;
var
a,b,dfs,bfs,max:array[..maxn]of longint;
f:array[..maxn*]of node;
n,tot:longint;
ans,s:double; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; procedure build(l,r:longint);
var
now,mid:longint;
begin
inc(tot);now:=tot;
f[now].l:=l;f[now].r:=r;
if l=r then
begin
f[now].min:=a[l];
exit;
end;
mid:=(l+r)>>;
f[now].lc:=tot+;
build(l,mid);
f[now].rc:=tot+;
build(mid+,r);
f[now].min:=min(f[f[now].lc].min,f[f[now].rc].min);
end; function min(now,l,r:longint):longint;
var
mid:longint;
begin
if (f[now].l>=l) and (f[now].r<=r) then exit(f[now].min);
mid:=(f[now].l+f[now].r)>>;
min:=n;
if l<=mid then min:=min(min(f[now].lc,l,r),min);
if r>mid then min:=min(min(f[now].rc,l,r),min);
end; procedure main;
var
i:longint;
begin
read(n);
for i:= to n do read(a[i]);
for i:= to n do read(b[i]);
for i:= to n do bfs[b[i]]:=i;
for i:= to n do a[i]:=bfs[a[i]];
for i:= to n do dfs[a[i]]:=i;
for i:= to n do
if a[i]>max[i-] then max[i]:=a[i]
else max[i]:=max[i-];
ans:=;
build(,n);
for i:= to n- do
if (i=) or (dfs[i+]<dfs[i]) then ans:=ans++s
else
if dfs[i+]=dfs[i]+ then
begin
if max[dfs[i]]<=i+ then s:=s+0.5;
end
else
if min(,dfs[i],dfs[i+])<i then s:=;
ans:=ans+s;
writeln(ans-0.001::);writeln(ans::);writeln(ans+0.001::);
end; begin
main;
end.

3244: [Noi2013]树的计数 - BZOJ的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. [bzoj3244] [洛谷P1232] [Noi2013] 树的计数

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

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

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

  8. 【uoj122】 NOI2013—树的计数

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

  9. [HNOI2004]树的计数 BZOJ 1211 prufer序列

    题目描述 输入输出格式 输入格式: 输入文件第一行是一个正整数n,表示树有n个结点.第二行有n个数,第i个数表示di,即树的第i个结点的度数.其中1<=n<=150,输入数据保证满足条件的 ...

随机推荐

  1. HDU4272LianLianKan(dfs)

    Problem Description I like playing game with my friend, although sometimes looks pretty naive. Today ...

  2. Sass之初识

    Sass is the most mature, stable, and powerful professional grade CSS extension language in the world ...

  3. CSS之transition(动画)

    Transform字面上就是变形,改变的意思.在CSS中transform主要包括以下几种:旋转rotate.扭曲skew.缩放scale和移动translate以及矩阵变形matrix. 下面我们一 ...

  4. ASP.NET 使用 System.Web.Script.Serialization 解析 JSON (转)

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programming Langu ...

  5. javascript将浮点数转换成整数的三个方法

    浮点数转换成整数方法有很多,本例为大家介绍常用的三个方法,如果读者想到其他好用方法,也可以交流一下   Summary 暂时我就想到3个方法而已.如果读者想到其他好用方法,也可以交流一下 parseI ...

  6. python基础:自定义函数

    一.背景 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下 ...

  7. 移动web开发的一些坑

    类似的题目一搜一大堆,我就不再写那些meta标签类似的内容了,记录一下自己实现中遇到的问题,如果能帮到你,那再好不过了. 1px border的问题,大家能搜到很多方案,但如何选择还是要根据实际情况, ...

  8. javaScript入门2--基本概念

    语法: 1.区分大小写!! 2.标识符:既变量,函数名,属性名,参数. 1.第一个字符必须为字母,_,或者$ 2.其他字符可以是字母,_,&,或者数字 3.注释: 1.单行注释:// 2.多行 ...

  9. QT 信号与槽连接

    转帖 http://www.cnblogs.com/cnhome/archive/2009/10/01/1577277.html 信号(SIGNAL)和槽(SLOT)是Qt编程的一个重要部分.这个机制 ...

  10. Tables for condition techniques

    T682i  -- Access sequence and the tables   T685  -- Condition types and Access sequences   T683s  -- ...