题面

梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到 点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中等概率地 选择一条走过去, 为了确保第二天能够准时到校, 你要求出每个梦期望经过多少条边才能苏 醒. 为了避免精度误差, 你要输出答案模10^9 + 7的结果.
对于 100%的数据, N <= 100000, Q <= 100000.

失智题

一点想法都没有.jpg
只想到了这一点:
由于期望的线性性,我们可以对于每一条边计算贡献。

如果是图,这的确没什么用。 但是注意这是一颗树,对于有向边(u,fa[u])(u,fa[u])(u,fa[u]),走过他需要的期望步数是可以计算的:

fx=1+∑1+fc+fxdegfx=1+∑1+fc+fxdeg

f_x = \frac {1 + \sum 1 + f_c + f_x} {deg}
,其中f_c是x的儿子,deg是x的度数(当前可以选择的边数)。
这个方程的意义是: 有 1/deg1/deg1/deg的概率直接走过,其余的概率都是走入儿子,再从儿子走回来,再重复上述过程。
其中运用了一种将未知数自己列入方程的思想,就像递归一样。

对于自上往下的边也差不多是同理的。
这样做了之后,询问就是直接树上路径求和了。
(推式子之后可以发现边权只有整数)

实现

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 1e5+10, mo = 1e9 + 7;
ll f[N],g[N],pg[N],pf[N];
int n,Q,final[N],nex[2*N],to[2*N],tot;
int w[N][20],d[N],sc[N],dep[N];void link(int x,int y) {to[++tot]=y,nex[tot]=final[x],final[x]=tot;
}void dfs(int x,int fa) {w[x][0] = fa;for (int i = 1; i <= 18; i++)w[x][i] = w[w[x][i-1]][i-1];dep[x] = dep[fa] + 1;for (int i = final[x]; i; i=nex[i]) {int y = to[i]; if (y == fa) continue;dfs(y,x);d[x]++;f[x] += f[y];sc[x] += f[y];}if (x != 1) {d[x]++;f[x] += d[x];}
}void dfs2(int x,int fa) {g[x] += g[fa] + d[fa];for (int i = final[x]; i; i=nex[i]) {int y = to[i]; if (y == fa) continue;g[y] = sc[x] - f[y];dfs2(y,x);}
}void dfs3(int x,int fa) {pg[x] += pg[fa] + g[x];pf[x] += pf[fa] + f[x];for (int i = final[x]; i; i=nex[i]) {int y = to[i]; if (y == fa) continue;dfs3(y,x);}
}int lca(int x,int y) {if(dep[x] < dep[y]) swap(x,y);for (int i = 18; ~i; i--)if (dep[w[x][i]] >= dep[y]) x = w[x][i];if (x==y) return x;for (int i = 18; ~i; i--)if (w[x][i] != w[y][i])x = w[x][i], y = w[y][i];return w[x][0];
}int main() {freopen("tree.in","r",stdin);freopen("tree.out","w",stdout);cin>>n>>Q;for (int i = 1; i < n; i++) {int u,v; scanf("%d %d",&u,&v);link(u,v), link(v,u);}dfs(1,0); f[1] = 0;dfs2(1,0);dfs3(1,0);for (int i = 1; i <= Q; i++) {int u,v; scanf("%d %d",&u,&v);int l = lca(u,v);ll ans = pf[u] - pf[l] + pg[v] - pg[l];printf("%lld\n",ans % mo);}
}

jzoj5814 【NOIP提高A组模拟2018.8.14】 树 (树上期望,递归法列方程)相关推荐

  1. jzoj5814 [NOIP提高A组模拟2018.8.14] 树 树形dp

    Description 梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到 点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中 ...

  2. 5814. 【NOIP提高A组模拟2018.8.14】 树(期望 + 倍增)

    5814. [NOIP提高A组模拟2018.8.14] 树 Problem 给定一棵nnn个点的树,m" role="presentation">mmm次询问,每次 ...

  3. JZOJ 5814. 【NOIP提高A组模拟2018.8.14】 树

    梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中等概率地选择一条走过去, ...

  4. JZOJ5814. 【NOIP提高A组模拟2018.8.14】 树

    Description 梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到 点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中 ...

  5. 5814. 【NOIP提高A组模拟2018.8.14】 树

    题目描述 梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到 点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中等概率地 选择 ...

  6. jzoj 5814. 【NOIP提高A组模拟2018.8.14】 树(期望)

    Description 梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到 点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中 ...

  7. jzoj 5814. 【NOIP提高A组模拟2018.8.14】树 dp+lca

    Description 梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到 点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中 ...

  8. JZOJ 5820. 【NOIP提高A组模拟2018.8.16】 非法输入

    Description 在算法竞赛中,题目一般保证了输入数据的合法性.然而在工程开发中,我们往往不期望程 序得到的输入都是合法的. D 君正忙着向校内 OJ 添加题目,在写了第 233 个 val.c ...

  9. 5817. 【NOIP提高A组模拟2018.8.15】 抄代码

    Description J 君是机房的红太阳,每次模拟她总是 AK 虐场.然而在 NOIP2117 中,居然出现了另一位 AK 的选手 C 君! 这引起了组委会的怀疑,组委会认为 C 君有抄袭 J 君 ...

最新文章

  1. 7-Zip 19.00 正式版发布,修正 Win10 1809(17763) 可能无法正常使用大内存页
  2. 目标检测学习笔记--DSSD算法
  3. 1.4 Float类
  4. CentOS7 安装redis-5.0.5/注册为系统服务及单机启动多个redis服务
  5. android Fragments详解一:概述
  6. linux光盘运行iso,如何在Windows,Mac和Linux上从光盘创建ISO文件 | MOS86
  7. Git Specification
  8. 价格高达万元!苹果将推1TB存储版本的iPhone
  9. 苹果或推中国特色版 iPhone;小米回应萌拍抄袭苹果事件;微软停止审核发布 Windows Phone 8.x | 极客头条...
  10. FineUIPro控件库深度解析
  11. Python数据结构与算法笔记(八):数据结构——树,二叉树和AVL树
  12. 自定义http报头_http协议报头详解HTTP协议结构
  13. 7-zip压缩解压软件.html,7-Zip 压缩率比较高的压缩软件 17.01 美化优化版
  14. 北航计算机本科生考研,和计算机考研的师弟师妹们分享一下经验本人本科北航...
  15. 上海财经应用统计考python_20上财应用统计415分经验帖(初试第一)
  16. 如何运用dos命令进入C盘?Dos常用命令大全
  17. 2016年高校保送生拟录取名单(清华大学)
  18. 第十三届蓝桥杯大赛软件赛省赛真题
  19. 【Linux】创建、修改和删除用户组(groupadd | groupmod | groupdel)
  20. 畅邮(DM Pro)-一款强悍、纯净而稳定的重量级电子邮箱客户端(支持分发、追踪)...

热门文章

  1. 嵌入式Linux 阻塞和非阻塞 IO 驱动设备访问模式
  2. Harbor部署及使用
  3. 怎么在抖音引流带货?抖音引流带货技巧有哪些
  4. HDU AWR电磁场与微波实验 操作记录
  5. delphi 发生内存错误处理方法
  6. (EI检索)2021年第五届复合材料与高分子科学工程国际会议
  7. 哈氏妇科亮相中医妇科领域学术峰会
  8. Mybatis自定义类型映射处理器
  9. Flink SourceFunction/SinkFunction
  10. ComponentOne 2016 V3 发布