(警告:本篇博客包含大量人类本质内容)

先处理出来lca,然后就只需要知道从每个点到他的父亲、和从他的父亲到这个点的期望时间就可以了

我们设f[x]为x到他父亲的期望时间;g[x]为从x的父亲到x的期望时间(注意到这两个是不一样的)

只考虑怎么算f,g是类似的

从某个点想走到他父亲时,情况会有:直接走到;先走到某个儿子然后走回来,再走到父亲;先走到某个儿子然后走回来,再走到某个儿子然后走回来,再走到某个儿子然后走回来,....,然后走到父亲

假设x有k个儿子,每个儿子记为ch[1...k]

那我们能得出$f[x]=\frac{1}{k+1}+\sum\limits_{i=1}^{k}{\frac{f[ch[i]]+1}{k+1}}+\frac{k}{k+1}(\frac{1}{k+1}+\sum\limits_{i=1}^{k}{\frac{f[ch[i]]+1}{k+1}}+\frac{k}{k+1}(...$

意思是,有$\frac{1}{k+1}$的可能性直接走到,另外$\frac{1}{k+1}$先用1时间走错到儿子、然后再用儿子的那个期望时间走回来,并以$\frac{k}{k+1}$的可能性再次有$\frac{1}{k+1}$的可能性直接走到,另外$\frac{1}{k+1}$先用1时间走错到儿子、然后再用儿子的那个期望时间走回来,并以$\frac{k}{k+1}$的可能性再次...

把$\frac{1}{k+1}+\sum\limits_{i=1}^{k}{\frac{f[ch[i]]+1}{k+1}}$记为a,$\frac{k}{k+1}$,就有$f[x]=a+b(a+b(a+b(a+b(....=(1+b^1+b^2+...)a=\frac{a}{1-b}$(等比数列和的极限)

这样dfs一下(好几下),就可以算出f了,g同理(注意顺序,两次dfs分别算f和g,算f的时候先算孩子,算g的时候先算父亲),只不过是有可能走错到父亲

然后倍增记一记f和g的和,做lca就行了(注意路径的方向)

然后就wa了...

可以发现其实这些期望都是整数,因为$\frac{1}{1-b}=k+1$,而a的分母又都是k+1...所以改用long long,避免掉奇奇怪怪的精度问题,就可以过了..(怀疑是%.4lf是否四舍五入的问题,我的本地是会四舍五入的所以拍不出锅,但要是直接截取就锅了...)

 #include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=5e4+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int eg[maxn*][],egh[maxn],ect;
int N,Q;
ll f[maxn][],g[maxn][];
int fa[maxn][],dep[maxn]; inline void adeg(int a,int b){
eg[++ect][]=b;eg[ect][]=egh[a];egh[a]=ect;
} void dfs1(int x){
int k=;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==fa[x][]) continue;
dep[b]=dep[x]+;fa[b][]=x;
k++;dfs1(b);
}
if(fa[x][]){
ll alpha=;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==fa[x][]) continue;
alpha+=f[b][]+;
}
f[x][]=alpha;
} } void dfs2(int x){
int k=;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==fa[x][]) continue;
k++;
}
if(fa[x][]){
ll alpha=;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==fa[x][]) continue;
alpha+=f[b][]+;
}
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==fa[x][]) continue;
ll alphai=alpha-(f[b][]+);
alphai+=g[x][]+;
g[b][]=alphai;
}
}else{
ll alpha=;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==fa[x][]) continue;
alpha+=f[b][]+;
}
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==fa[x][]) continue;
double alphai=alpha-(f[b][]+);
g[b][]=alphai;
}
}
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==fa[x][]) continue;
dfs2(b);
}
// printf("%d %lf %lf\n",x,f[x][0],g[x][0]);
} void getst(int x){
for(int i=;fa[x][i]&&fa[fa[x][i]][i];i++){
fa[x][i+]=fa[fa[x][i]][i];
f[x][i+]=f[x][i]+f[fa[x][i]][i];
g[x][i+]=g[x][i]+g[fa[x][i]][i];
// printf("%d %d %d %lf %lf\n",x,i+1,fa[x][i+1],f[x][i+1],g[x][i+1]);
}
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==fa[x][]) continue;
getst(b);
}
} inline ll solve(int s,int t){
ll re=;
if(dep[s]>dep[t]){
for(int i=;i>=;i--){
if(fa[s][i]&&dep[fa[s][i]]>=dep[t]){
re+=f[s][i],s=fa[s][i];
}
}
// if(s==t) return re-f[s][0];
}else if(dep[t]>dep[s]){
for(int i=;i>=;i--){
if(fa[t][i]&&dep[fa[t][i]]>=dep[s]){
re+=g[t][i],t=fa[t][i];
}
}
// if(s==t) return re-g[t][0];
}
if(s==t) return re;
for(int i=;i>=;i--){
if(fa[s][i]&&fa[t][i]&&fa[s][i]!=fa[t][i]){
re+=f[s][i]+g[t][i];
s=fa[s][i],t=fa[t][i];
}
}re+=f[s][]+g[t][];
return re;
} int main(){
// freopen("5449.in","r",stdin);
// freopen("5449.out","w",stdout);
int i,j,k;
for(int T=rd();T;T--){
CLR(fa,);CLR(dep,);CLR(egh,);ect=;
CLR(f,);CLR(g,);
N=rd();
for(i=;i<N;i++){
int a=rd()+,b=rd()+;
adeg(a,b);adeg(b,a);
}
dep[]=;dfs1();dfs2();
getst();
Q=rd();
for(i=;i<=Q;i++){
int p=rd(),lst=rd()+;
ll ans=;
for(j=;j<=p;j++){
int now=rd()+;
ans+=solve(lst,now);
lst=now;
}
printf("%lld.0000\n",ans);
}
if(T>) printf("\n");
}
return ;
}

hdu5449 Robot Dog (树形dp+倍增lca)的更多相关文章

  1. Codeforces 418d Big Problems for Organizers [树形dp][倍增lca]

    题意: 给你一棵有n个节点的树,树的边权都是1. 有m次询问,每次询问输出树上所有节点离其较近结点距离的最大值. 思路: 1.首先是按照常规树形dp的思路维护一个子树节点中距离该点的最大值son_di ...

  2. 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...

  3. [NOIP2018]保卫王国(树形dp+倍增)

    我的倍增解法吊打动态 \(dp\) 全局平衡二叉树没学过 先讲 \(NOIP\) 范围内的倍增解法. 我们先考虑只有一个点取/不取怎么做. \(f[x][0/1]\) 表示取/不取 \(x\) 后,\ ...

  4. hdu 4123(树形dp+倍增)

    Bob’s Race Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. 青云的机房组网方案(简单+普通+困难)(虚树+树形DP+容斥)

    题目链接 1.对于简单的版本n<=500, ai<=50 直接暴力枚举两个点x,y,dfs求x与y的距离. 2.对于普通难度n<=10000,ai<=500 普通难度解法挺多 ...

  6. P2495 [SDOI2011]消耗战 lca倍增+虚树+树形dp

    题目:给出n个点的树  q次询问  问切断 k个点(不和1号点联通)的最小代价是多少 思路:树形dp  sum[i]表示切断i的子树中需要切断的点的最小代价是多少 mi[i]表示1--i中的最小边权 ...

  7. 【BZOJ-3631】松鼠的新家 树形DP?+ 倍增LCA + 打标记

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1231  Solved: 620[Submit][Stat ...

  8. HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...

  9. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

随机推荐

  1. R 语言-基础

    R语言 1997年成为GNU项目 开源免费 R官方网址 www.r-project.org R是数据分析领域的语言小巧灵活,通过扩展包来增强功能绘图功能代码简单 开发环境R + RStudio 1.数 ...

  2. 基于多进程和基于多线程服务器的优缺点及nginx服务器的启动过程

    基于多进程服务器的优点: 1.由操作系统进行调度,运行比较稳定强壮 2.能够方便地通过操作系统进行监控和管理 例如对每个进程的内存变化状况,甚至某个进程处理什么web请求进行监控.同时可以通过给进程发 ...

  3. WPF Style

      <Application x:Class="WzlyTool.App" xmlns="http://schemas.microsoft.com/winfx/20 ...

  4. JS跨浏览器的事件处理

    1. 事件流 事件:用户或浏览器自身执行的某种动作.如click(点击事件).mouse***(鼠标事件). 事件流:页面中接收事件的顺序,也可理解为事件在页面中传播的顺序. DOM事件流包括三个阶段 ...

  5. 设计模式 笔记 中介者模式 Mediator

    //---------------------------15/04/27---------------------------- //Mediator 中介者模式----对象行为型模式 /* 1:意 ...

  6. Express入门介绍vs实例讲解

    下午在团队内部分享了express相关介绍,以及基于express的实例.内容提纲如下. 什么是Express 为什么要用Express 路由规则 一切皆中间件 实例:Combo Applicatio ...

  7. CentOS 6.8 安装vsftpd

    简介: vsftpd是“very secure FTP daemon”的缩写,是一个完全免费的.开发源代码的ftp服务器软件. 特点: vsftpd是一款在Linux发行版本中最受推崇的FTP服务器程 ...

  8. unity2D限制位置的背景移动补偿效果

    有时候我们想要背景可以跟随相机移动补偿,但是又不想该背景物体离原来的位置太远,比如我们想要一棵树在一个房子的后面,然后使用相机补偿使其跟随移动,达到3D错觉效果,但是我们又不想该物体偏离房屋太远.假设 ...

  9. 初识kibana

    前言: 什么是Kibana?? Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的.你可以用kibana搜索.查看.交互存放在Elasticsearch索引里 ...

  10. PAT甲题题解-1046. Shortest Distance (20)-做了一个假的最短路,水

    一开始以为是最短路,结果是给你一个环,让你求环上两点之间的距离...那还做毛线 然而还是得做毛线 #include <iostream> #include <cstdio> # ...