NOI都是酱的题怎么玩啊,哇.jpg

原题:

我们知道一棵有根树可以进行深度优先遍历(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

2≤n≤200000

恩开始想了一下一点思路都没有。。。。。。。。。好吧我应该想一想暴力的

直接看题解了,这里只解释题解

首先先把bfs调成1,2,3……n的形式,dfs跟着调方便讨论

然后对于b=a+1

因为bfs是按层推,所以b要么跟a一层,要么比a多一层,即height[b]=height[a]+1或height[b]=height[a],如果在同一层则b一定在a的后面

如果dfs[a]>dfs[b],表示dfs的时候是先到a再到b,那么a和b就不能在同一层,则height[b]=height[a]+1

如果dfs[a]<dfs[b],有两种情况,dfs[b]!=dfs[a]+1,这个时候显然只能是ab在同一层且a在b前面,注意因为bfs[b]=bfs[a]+1(注意bfs[a]=a)

如果dfs[b]=dfs[a]+1,还是有两种情况,菊花或链,如果菊花就height[b]=height[a],如果链就height[b]=height[a]+1

尽管这种情况有机会是的height[b]大于height[a],但是这个未必会对答案造成影响

啥时候会造成影响呢,首先height[b]=height[a]+1,然后b是这一层最后一个点,这个时候对答案就贡献了

怎么判断这种情况?当剩下的点都是b的子树的时候就是这种情况,如果用flag[i]表示i有没有被遍历到,计一个r表示从最右边起最多连续多少个flag[i]==1,l表示从左起最多连续多少个flag[i]==1,那么当i-1=n-r+1-l,即左边一截全是1,右边一截全是1,中间全是0的时候就表示剩下的点全是b的子树

因为还有height[b]=height[a]的情况而且这种情况对于后面没有影响,因此此时给答案贡献的期望值为0.5

为啥height[b]=height[a]+1会对答案有贡献呢,因为b=a+1,前面是沿着bfs序一层一层推的,结合上面的性质就容易立即如果对答案贡献

这种题完全没思路啊,NOI怎么玩啊QAQ

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
int n,a[],b[];
int rvs[];
bool flg[];
int main(){freopen("ddd.in","r",stdin);
cin>>n;
for(int i=;i<=n;++i) a[i]=rd(),rvs[a[i]]=i;
for(int i=;i<=n;++i) b[i]=rvs[rd()];
int l=,r=n+; double ans=;
flg[]=flg[]=true;
for(int i=;i<=n;++i){
if(b[i-]>b[i]) ++ans;
else if(b[i]==b[i-]+) ans+=(n-r++l==i-)*0.5;
flg[b[i]]=true;
while((l<r) & flg[r-]) --r;
while((l<r) & flg[l+]) ++l;
}
printf("%.3lf\n%.3lf\n%.3lf\n",ans-0.001,ans,ans+0.001);
return ;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 【uoj122】 NOI2013—树的计数

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

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

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

随机推荐

  1. day25-python操作redis一

    1.     Python操作nosql数据库 NoSQL,泛指非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2 ...

  2. Linux十字病毒查杀处理

    之前处理过一次十字病毒,但未好好整理处理过程,现在转载一篇来自51cto的文章. 转自:http://blog.51cto.com/ixdba/2163018 十字符病毒,杀不死的小强,一次云服务器沦 ...

  3. Java使用POI插件将数据以excel形式备份

    将数据以表格形式进行备份 (1)导入poi的jar包 放入lib下:  WebRoot\WEB-INF\lib\poi-3.2-FINAL-20081019.jar 下载链接:https://gith ...

  4. day04 列表

    今天主要学习了 列表 什么是列表 定义: 能装对象的对象 在python中使用[]来描述列表, 内部元素用逗号隔开. 对数据类型没有要求 列表存在索引和切片. 和字符串是一样的. 2. 相关的增删改查 ...

  5. tomcat 服务器线程问题

    http://blog.csdn.net/wtopps/article/details/71339295 http://blog.csdn.net/wtopps/article/details/713 ...

  6. iOS 统一配置

    1 .统一设置nav标题样式: - (void)_setNavigationTitle { NSDictionary *navigationParams = @{NSForegroundColorAt ...

  7. leetcode python 002

    ##002 Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8# 链表节点都是一位数字,以上可以视为2 ...

  8. CodeMix入门基础知识

    CodeMix在线订购年终抄底促销!火爆开抢>> CodeMix入门 CodeMix是一个Eclipse插件,可以直接从Eclipse访问VS Code和为Code OSS构建的附加扩展的 ...

  9. JavaWeb基础-Jsp基础语法

    jsp基础语法 JSP的组成 静态内容.指令.表达式.小脚本.声明.注释 JSP的生命周期 用户发出index.jsp ,服务端判断是否是第一次请求,若是第一次请求,则tomcat中的JSP引擎中的文 ...

  10. SpringMVC配置及使用

    SpringMVC基本配置 SpringMVC是基本请求响应模式的框架. 在项目中集成SpringMVC框架首先需要导入相关的jar包,所需包具体如下: commons-dbcp.jar common ...