bzoj 3244: [Noi2013]树的计数
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
Solution
用期望的线性性拆成点对的贡献
我们发现如果点对 \((x,y)\) 必须处在不同层,那么期望 \(+1\),必须在相同层则没有贡献
如果不确定是否在同层,则为 \(0.5\)
现在只需要把点分类即可:
1.如果两个点在 \(bfs\) 序中相邻, \(bfs[a]<bfs[b]\),且满足 \(dfs[a]>dfs[b]\),那么就必须不同层
2.如果两个点在 \(dfs\) 序中相邻, \(dfs[a]<dfs[b]\),且满足 \(bfs[a]<bfs[b]\),代表这两个点的深度差不超过 \(1\),就意味着 \(bfs\) 序中,\(a\) 到 \(b\) 之间的点必须同层
考虑怎么满足这些约束:
条件 \(1\) 比较好判断,对于条件 \(2\) ,当一个点对确定深度差不超过一时,在 \(bfs\) 序中这两个点的中间一段必须同层,贡献已经确定是 \(0\),我们把中间的点打上一个标记,表示已经确定了贡献,可以用差分实现
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,a[N],w[N],p[N],s[N],c[N],t[N],b[N];
int main(){
int x;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&x),p[x]=i;
for(int i=1;i<=n;i++)scanf("%d",&x),a[p[x]]=i,b[i]=p[x];
t[1]++;c[1]++;c[2]--;
for(int i=2;i<=n;i++)if(b[i]>b[i+1])t[i]++,c[i]++,c[i+1]--;
for(int i=1;i<=n;i++)s[i]=s[i-1]+t[i];
for(int i=1;i<=n;i++)if(a[i]<a[i+1] && s[a[i+1]-1]-s[a[i]-1])c[a[i]]++,c[a[i+1]]--;
double ans=0;
for(int i=1;i<=n;i++){
c[i]+=c[i-1];
if(c[i])ans+=t[i];
else ans+=0.5;
}
printf("%.3lf\n",ans);
return 0;
}
bzoj 3244: [Noi2013]树的计数的更多相关文章
- 3244: [Noi2013]树的计数 - BZOJ
Description 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同, ...
- [UOJ#122][NOI2013]树的计数
[UOJ#122][NOI2013]树的计数 试题描述 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的 DFS 序以及 BFS 序.两棵不同的树的 DFS 序 ...
- BZOJ 1211: [HNOI2004]树的计数( 组合数学 )
知道prufer序列就能写...就是求个可重集的排列...先判掉奇怪的情况, 然后答案是(N-2)!/π(d[i]-1)! -------------------------------------- ...
- bzoj 1211: [HNOI2004]树的计数 -- purfer序列
1211: [HNOI2004]树的计数 Time Limit: 10 Sec Memory Limit: 162 MB Description 一个有n个结点的树,设它的结点分别为v1, v2, ...
- BZOJ3244 NOI2013树的计数(概率期望)
容易发现的一点是如果确定了每一层有哪些点,树的形态就确定了.问题变为划分bfs序. 考虑怎样划分是合法的.同一层的点在bfs序中出现顺序与dfs序中相同.对于dfs序中相邻两点依次设为x和y,y至多在 ...
- [BZOJ3244][NOI2013]树的计数
这题大家为什么都写O(NlogN)的算法呢?…… 让本蒟蒻来写一个O(N)的吧…… 首先还是对BFS序和DFS序重编号,记标好的DFS序为d[1..n].令pos[x]为x在d[]中出现的位置,即po ...
- [bzoj3244][noi2013]树的计数 题解
UPD: 那位神牛的题解更新了,在这里. ------------------------------------------------------------------------------- ...
- [bzoj3244] [洛谷P1232] [Noi2013] 树的计数
Description 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同, ...
- BZOJ 1211 HNOI2004 树的计数 Prufer序列
题目大意:给定一棵树中全部点的度数,求有多少种可能的树 Prufer序列.详细參考[HNOI2008]明明的烦恼 直接乘会爆long long,所以先把每一个数分解质因数.把质因数的次数相加相减.然后 ...
随机推荐
- TensorFlow实现Softmax Regression识别手写数字中"TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败”问题
出现问题: 在使用TensorFlow实现MNIST手写数字识别时,出现"TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应 ...
- 安装QT5.02
1.下载QT5 SDK 下载地址:http://qt-project.org/downloads. 2.安装QT5 下载完后,假设放在Download/,切换到该目录,输入:./qt-linux-op ...
- verilog学习笔记(4)_有限状态机
有限状态机: 有限状态机是由寄存器组和组合逻辑构成的硬件时序电路: - 其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态: - 究竟转 ...
- day-2 如何搭建一个github代码库
最近在听尤瓦尔·赫拉利代写的两本书<人类简史>和<未来简史>两本书评,一部描述人类从哪里来,一部描述人类将往哪里去,书中阐述以前我们经历的饥饿.疾病和战争已经渐渐逝去,未来我们 ...
- css中的position
一.position语法与结构 position语法: position : static absolute relative position参数:static : 无特殊定位,对象遵循HTML定位 ...
- LeetCode & Q283-Move Zeroes-Easy
Array Two Pointers Description: Given an array nums, write a function to move all 0's to the end of ...
- 解决编写的 html 乱码问题
- Spring Security 入门(1-6-2)Spring Security - 内置的filter顺序、自定义filter、http元素和对应的filterChain
Spring Security 的底层是通过一系列的 Filter 来管理的,每个 Filter 都有其自身的功能,而且各个 Filter 在功能上还有关联关系,所以它们的顺序也是非常重要的. 1.S ...
- leetcode算法: Average of Levels in Binary Tree
Given a non-empty binary tree, return the average value of the nodes on each level in the form of an ...
- zipline-benchmarks.py文件改写
改写原因:在这个模块中的 get_benchmark_returns() 方法回去谷歌财经下载对应SPY(类似于上证指数)的数据,但是Google上下载的数据在最后写入Io操作的时候会报一个恶心的编码 ...