UOJ #122 【NOI2013】 树的计数
题目链接:树的计数
这道题好神啊……正好有人讲了这道题,那么我就写掉吧……
首先,为了方便考虑,我们可以把节点重标号,使得\(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】 树的计数的更多相关文章
- [UOJ#122][NOI2013]树的计数
[UOJ#122][NOI2013]树的计数 试题描述 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的 DFS 序以及 BFS 序.两棵不同的树的 DFS 序 ...
- 【BZOJ3244】【UOJ#122】【NOI2013]树的计数
NOI都是酱的题怎么玩啊,哇.jpg 原题: 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的 ...
- 【uoj122】 NOI2013—树的计数
http://uoj.ac/problem/122 (题目链接) 题意 给出一棵树的dfs序和bfs序,保证一定可以构成一棵树.问构成的树的期望深度. Solution 这是一个悲伤的故事,我YY的东 ...
- NOI2013 树的计数
题目:http://uoj.ac/problem/122 85%做法: 动态规划. 首先重编号,BFS序变成1...n,然后DFS序相应重编号. 记pos[i]为i号点在DFS中的位置,即pos[d[ ...
- 3244: [Noi2013]树的计数 - BZOJ
Description 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同, ...
- bzoj 3244: [Noi2013]树的计数
Description 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同, ...
- 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/UOJ122 [Noi2013]树的计数
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
随机推荐
- Android 仿微信朋友圈发动态功能(相册图片多选)
代码分享 代码名称: 仿微信朋友圈发动态功能(相册图片多选) 代码描述: 仿微信朋友圈发动态功能(相册图片多选) 代码托管地址: http://www.apkbus.com/android-15276 ...
- OC开发_代码片段——使用Xib自定义tableViewCell
一.实现步骤 1.新建一个XIB文件:描述cell——tableCell.xib 2.新建UITableViewCell的子类,也就是cell文件:封装XIB内部的所有东西——TestCell.m \ ...
- Eclipse git pull 报Nothing to fetch 异常原因
eclipse git pull 报错 // 使用这个配置就可以正常pull了 [core] symlinks = false repositoryform ...
- 信息收集1:DNSEUM命令
1,背景 今天无意中发现了dnsenum这个工具,在网上搜了下关于dnsenum的介绍和安装使用方法,资料不是很全,但还好这个工具也算简单,网上也都有源码,可以自行下载下来阅读阅读.本人好奇在本机(u ...
- 以jar包的形式来使用前端的各种框架、组件。
springboot(二):web综合开发 - 纯洁的微笑博客 http://www.ityouknow.com/springboot/2016/02/03/spring-boot-web.html ...
- redis cluster 集群畅谈(一)
redis单机在大数据量情况的会出现瓶颈问题,通过redis 主从架构和 哨兵集群结合可以实现99.99% 高可用 .水平扩容支持更高QPS的解决方案. 在大数据量面前,主从架构结合哨兵集群的解决方案 ...
- Python爬虫实例(五) requests+flask构建自己的电影库
目标任务:使用requests抓取电影网站信息和下载链接保存到数据库中,然后使用flask做数据展示. 爬取的网站在这里 最终效果如下: 主页: 可以进行搜索:输入水形物语 点击标题进入详情页: 爬虫 ...
- ubuntu安装conda
https://blog.csdn.net/menghuanbeike/article/details/79138651 你需要前往Anaconda的官网看下目前的下载地址: https://www. ...
- Redis主从切换
案例 易车网:http://www.greatops.net/?id=232 redis主从切换:http://www.cnblogs.com/itdragon/p/7932178.htmlhttps ...
- OleDb未指定错误
桌面开发,居然也出这种问题: 1. C#读取Excel“未指定错误” http://www.connectionstrings.com/ http://www.dnetzj.com/Content/2 ...