BZOJ3244 NOI2013树的计数(概率期望)
容易发现的一点是如果确定了每一层有哪些点,树的形态就确定了。问题变为划分bfs序。
考虑怎样划分是合法的。同一层的点在bfs序中出现顺序与dfs序中相同。对于dfs序中相邻两点依次设为x和y,y至多在x的下一层。特殊的,根单独作为一层。
这些条件显然是必要的,考虑一种构造方案:对于某个点,如果其在dfs序中前一个点的下一层则直接连边,否则从其bfs序中前一个点(显然是与其在同一层的)的父亲连边。这看起来是没有问题的,所以这些条件也是充分的。
接下来考虑怎么算答案。如果bfs序中相邻两点被划分在了不同层树高就会++,于是考虑相邻点是否能划在同一层。
首先如果bfs序中相邻两点在bfs序和dfs序中的相对顺序不同,其必须划分,这保证了第一个条件满足。
然后对dfs序中相邻两点x和y,其在bfs序中x到y(有序,若x在y后面则该限制无效)这段区间至多被划分一次,这显然保证了第二个条件满足。
这样可以固定一些位置是否划分,保证了方案合法,划分一次提供1贡献。而对于剩下的位置不管是否划分都是合法的,所以提供0.5的贡献。
至于具体怎么搞,第一个条件扫一遍即可确定。第二个条件若区间内已被划分打个标记即可。否则虽然看起来有点麻烦,但实际上如果出现这种情况该区间长度只会为1。因为这说明他们之间的dfs序和bfs序相对顺序都是相同的,这仅当两点在同一层才会出现,而这样他们在bfs序中也是相邻的。
往往很多必要条件组合在一起就是充分的了,大力猜结论不要怂。
bzoj上莫名其妙要输出三个数。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 200010
int n,a[N],b[N],id_dfs[N],id_bfs[N],f[N],s[N],cnt[N],ans=;
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj3244.in","r",stdin);
freopen("bzoj3244.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
for (int i=;i<=n;i++) id_dfs[a[i]=read()]=i;
for (int i=;i<=n;i++) id_bfs[b[i]=read()]=i;
memset(f,,sizeof(f));f[]=;
for (int i=;i<n;i++)
if (id_dfs[b[i]]>id_dfs[b[i+]]) f[i]=;
for (int i=;i<n;i++) s[i]=s[i-]+(f[i]>);
for (int i=;i<n;i++)
if (id_bfs[a[i]]<id_bfs[a[i+]]&&s[id_bfs[a[i+]]-]>s[id_bfs[a[i]]-])
cnt[id_bfs[a[i]]]++,cnt[id_bfs[a[i+]]]--;
int x=;
for (int i=;i<n;i++)
{
x+=cnt[i];
if (x) f[i]=max(f[i],);
}
for (int i=;i<n;i++)
if (f[i]>=) ans+=f[i]<<;
else ans++;
//printf("%.3f",ans/2.0);
printf("%.3f\n%.3f\n%.3f",ans/2.0-0.001,ans/2.0,ans/2.0+0.001);
return ;
}
BZOJ3244 NOI2013树的计数(概率期望)的更多相关文章
- BZOJ3244 [Noi2013]树的计数 【数学期望 + 树遍历】
题目链接 BZOJ3244 题解 不会做orz 我们要挖掘出\(bfs\)序和\(dfs\)序的性质 ①容易知道\(bfs\)序一定是一层一层的,如果我们能确定在\(bfs\)序中各层的断点,就能确定 ...
- [BZOJ3244][NOI2013]树的计数
这题大家为什么都写O(NlogN)的算法呢?…… 让本蒟蒻来写一个O(N)的吧…… 首先还是对BFS序和DFS序重编号,记标好的DFS序为d[1..n].令pos[x]为x在d[]中出现的位置,即po ...
- [bzoj3244][noi2013]树的计数 题解
UPD: 那位神牛的题解更新了,在这里. ------------------------------------------------------------------------------- ...
- [UOJ#122][NOI2013]树的计数
[UOJ#122][NOI2013]树的计数 试题描述 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的 DFS 序以及 BFS 序.两棵不同的树的 DFS 序 ...
- [bzoj3244] [洛谷P1232] [Noi2013] 树的计数
Description 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同, ...
- 【BZOJ3244】【UOJ#122】【NOI2013]树的计数
NOI都是酱的题怎么玩啊,哇.jpg 原题: 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的 ...
- BZOJ3244/UOJ122 [Noi2013]树的计数
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- jzoj5987. 【WC2019模拟2019.1.4】仙人掌毒题 (树链剖分+概率期望+容斥)
题面 题解 又一道全场切的题目我连题目都没看懂--细节真多-- 先考虑怎么维护仙人掌.在线可以用LCT,或者像我代码里先离线,并按时间求出一棵最小生成树(或者一个森林),然后树链剖分.如果一条边不是生 ...
- 3244: [Noi2013]树的计数 - BZOJ
Description 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同, ...
随机推荐
- iframe的简单使用方法
1.父页面调用子页面的元素(a代表iframe的id或者class,b代表子页面) $('a').contents().find("b") 2.子页面调用父页面的元素(c代表父页面 ...
- 行为事件(ActionChains)源码详解
ActionChains简介 actionchains是selenium里面专门处理鼠标相关的操作如:鼠标移动,鼠标按钮操作,按键和上下文菜单(鼠标右键)交互. 这对于做更复杂的动作非常有用,比如悬停 ...
- python简单计时器实现
实现程序运行时间的显示与相互之间的计算: 实现代码: import time as t class Mytimer(): def __init__(self): self.unit=["年& ...
- 匹配追踪算法(MP)简介
图像的稀疏表征 分割原始图像为若干个\[\sqrt{n} \times \sqrt{n}\]的块. 这些图像块就是样本集合中的单个样本\(y = \mathbb{R}^n\). 在固定的字典上稀疏分解 ...
- redis高级应用(集群搭建、集群分区原理、集群操作)
文章主目录 Redis集群简介 Redis集群搭建 Redis集群分区原理 集群操作 参考文档 本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 ...
- Java 的 java_home, path, classpath
java_home: 指定 jdk 的安装目录. 第三方软件 Eclipse / Tomcat 在 java_home 指定的目录下查找安装好的 jdk. path: 配置 jdk 的安装目录.在命令 ...
- 转载----C/C++ 中 const 修饰符用法总结
感谢原创作者,写的好详细.不忍错过,所以转载过来了... 原文地址: https://www.cnblogs.com/icemoon1987/p/3320326.html 在这篇文章中,我总结了一些C ...
- Vue 列表渲染及条件渲染实战
条件渲染 有时候我们要根据数据的情况,决定标签是否进行显示或者有其他动作.最常见的就是,表格渲染的时候,如果表格没有数据,就显示无数据.如果有数据就显示表格数据. Vue 帮我们提供了一个v-if的指 ...
- 第10讲:利用SQL语言实现关系代数操作
一.实现并.交.差运算 1. 基本语法形式:子查询 [union [all] | intersect [all] | except [all] 子查询] ①意义:将关系代数中的∪.∩.- 分别用uni ...
- Daily Scrum 11.18
今日完成任务: 1.在提问问题的时候为问题创建索引 2.解决了修改个人资料后刷新没有更新的问题 3.初步加入了采纳功能(没完善UI设计) 遇到困难:创建索引之后,跳转到主页,需要重新登录,找了半天不知 ...