Random Access Iterator

\[Time Limit: 4000 ms \quad Memory Limit: 262144 kB
\]

题意

给出伪代码,问按着伪代码在树上跑,能够正确求出来树的深度的概率。

思路

先在树上 \(dfs\) 一遍,求出每个点可以走到的最深深度,用 \(deep\) 表示。

令 \(dp[i]\) 表示从 \(i\) 节点能够正确求出最深深度的概率。

  1. 如果 \(deep[u]\) 不等于最深深度,那么明显 \(dp[u]=0\)
  2. 如果 \(deep[u]\) 是最深深度而且走到了叶子节点,那么 \(dp[u]=1\)
  3. 其他情况,能够走到最深深度的概率 = \(1\) - 每次走每个点都不能走到最深深度的概率,用表达式表达就是,\(sz\) 表示当前节点可以走的其他节点数,特别注意 \(u=1\) 的情况就可以了。

\[ dp[u] = 1-\left(\frac{\sum_{v}(1-dp[v)}{sz-1}\right)^{sz-1}
\]

/***************************************************************
> File Name : a.cpp
> Author : Jiaaaaaaaqi
> Created Time : Wed 11 Sep 2019 02:48:22 PM CST
***************************************************************/ #include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#define lowbit(x) x & (-x)
#define mes(a, b) memset(a, b, sizeof a)
#define fi first
#define se second
#define pb push_back
#define pii pair<int, int> typedef unsigned long long int ull;
typedef long long int ll;
const int maxn = 1e6 + 10;
const int maxm = 1e5 + 10;
const ll mod = 1e9 + 7;
const ll INF = 1e18 + 100;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-8;
using namespace std; int n, m;
int cas, tol, T; int maxdeep;
vector<int> vv[maxn];
int deep[maxn];
ll dp[maxn]; ll fpow(ll a, ll b) {
ll ans = 1;
while(b) {
if(b&1) ans = ans*a%mod;
a = a*a%mod;
b >>= 1;
}
return ans;
} void dfs(int u, int fa, int d) {
deep[u] = d;
for(auto v : vv[u]) {
if(v == fa) continue;
dfs(v, u, d+1);
deep[u] = max(deep[u], deep[v]);
}
maxdeep = max(maxdeep, deep[u]);
} void solve(int u, int fa) {
if(deep[u] != maxdeep) {
dp[u] = 0;
return ;
}
if(vv[u].size() == 1) {
dp[u] = 1;
return ;
}
int sz = vv[u].size()-1;
if(u == 1) sz++;
ll ans = 0;
for(auto v : vv[u]) {
if(v == fa) continue;
solve(v, u);
ans += (1-dp[v]+mod);
ans %= mod;
}
ans = ans*fpow(sz, mod-2)%mod;
ans = fpow(ans, sz);
dp[u] = (1-ans+mod)%mod;
} int main() {
// freopen("in", "r", stdin);
scanf("%d", &n);
for(int i=1; i<=n; i++) {
vv[i].clear();
}
for(int i=1; i<n; i++) {
int u, v;
scanf("%d%d", &u, &v);
vv[u].pb(v);
vv[v].pb(u);
}
maxdeep = 0;
dfs(1, 0, 1);
solve(1, 0);
printf("%lld\n", dp[1]);
return 0;
}

Random Access Iterator 徐州网络赛(树形dp)的更多相关文章

  1. HDU 6201 2017沈阳网络赛 树形DP或者SPFA最长路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6201 题意:给出一棵树,每个点有一个权值,代表商品的售价,树上每一条边上也有一个权值,代表从这条边经过 ...

  2. hdu 4274 2012长春赛区网络赛 树形dp ***

    设定每个节点的上限和下限,之后向上更新,判断是否出现矛盾 #include<cstdio> #include<iostream> #include<algorithm&g ...

  3. ICPC 2019 徐州网络赛

    ICPC 2019 徐州网络赛 比赛时间:2019.9.7 比赛链接:The Preliminary Contest for ICPC Asia Xuzhou 2019 赛后的经验总结 // 比赛完才 ...

  4. 2019徐州网络赛 I J M

    I. query 比赛时候没有预处理因子疯狂t,其实预处理出来因子是\(O(nlog(n))\)级别的 每个数和他的因子是一对偏序关系,因此询问转化为(l,r)区间每个数的因子在区间(l,r)的个数 ...

  5. 2018 ICPC 徐州网络赛

    2018 ICPC 徐州网络赛 A. Hard to prepare 题目描述:\(n\)个数围成一个环,每个数是\(0\)~\(2^k-1\),相邻两个数的同或值不为零,问方案数. solution ...

  6. 2019icpc徐州网络赛

    A Who is better? 题意 excrt+斐波那契博弈 分析 Java的BigInteger对象默认为null,不能直接比较. 代码 import java.math.BigInteger; ...

  7. Random Access Iterator

    Random Access Iterator 树型概率DP dp[u]代表以当前点作为根得到正确结果的概率 将深度最深的几个点dp[u]很明显是1 然后很简单的转移 有k次,但我们要先看一次的情况,然 ...

  8. 计蒜客 41391.query-二维偏序+树状数组(预处理出来满足情况的gcd) (The Preliminary Contest for ICPC Asia Xuzhou 2019 I.) 2019年徐州网络赛)

    query Given a permutation pp of length nn, you are asked to answer mm queries, each query can be rep ...

  9. [徐州网络赛]Longest subsequence

    [徐州网络赛]Longest subsequence 可以分成两个部分,前面相同,然后下一个字符比对应位置上的大. 枚举这个位置 用序列自动机进行s字符串的下标转移 注意最后一个字符 #include ...

随机推荐

  1. 【转】python 调用super()初始化报错“TypeError: super() takes at least 1 argument”

    一.实验环境 1.Windows7x64_SP1 2.Anaconda2.5.0 + python2.7(anaconda集成,不需单独安装) 二.实验步骤 2.1 在python中有如下代码: cl ...

  2. linux录制终端信息并回放

    我们通常会录制桌面环境视频来作为教程使用,但是视频需要大量的存储空间,而终端脚本文件仅仅是一个文本文件,其文件大小不过是KB级别 1, 开始录制终端会话 [root@VM_0_15_centos ~] ...

  3. ng 打包给路径添加前缀

    1.ng build --base --href /前缀名/--common - chunk --output-hashing=all --optimization 2.更改ts和html中的路径,将 ...

  4. 使用 go modules 包管理工具(一)

    概述 我想实现一个开箱即用的 API 框架的轮子,这个轮子是基于 Gin 基础上开发的. 为什么是开箱即用,它会集成哪些功能? 以上功能点,都是常用的,后期可能还会增加. 废话不多说,咱们开始吧. 创 ...

  5. HTML -------- 标签、元素、属性,

    HTMl 中的标签.元素.属性, one.标签 :HTML是由一套标记标签 (markup tag)组成,通常就叫标签 标签由开始标签和结束标签组成 <p> 这是一个开始标签 </p ...

  6. 深入V8引擎-写在前面

    这一篇不打算讲技术,聊点别的吧,写这个的原因主要是看到了我博客园的签名,开始这个最终源码系列前想说点什么. 转行前端(达成) 入行1年vue源码(达成).webpack源码(半达成) 入行2年争取读通 ...

  7. Docker 快速安装&搭建 Mysql 环境

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  8. redis 实战操作RDB和AOF快照持久化

    前言:redis是我们常用的缓存方式,今天就来介绍下两种持久化的方式吧,先科普概念,再实战操作 一.RDB Redis将某一时刻的快照(备份的数据库数据)保存成一种称为RDB格式的文件中,这种格式是经 ...

  9. .net 6.0 新特性

    1. 属性初始化 class Person { public string Name { get; set; } public string Sex { get; set; } = "男&q ...

  10. python 练习题:请利用Python内置的hex()函数把一个整数转换成十六进制表示的字符串

    # -*- coding: utf-8 -*- # 请利用Python内置的hex()函数把一个整数转换成十六进制表示的字符串 n1 = 255 n2 = 1000 print(hex(n1)) pr ...