codeforces E. Famil Door and Roads 期望
一棵树,n个节点,边长为1,有q个询问,每个询问给出u,v(u != v),问在树上等概率加一条边,如果使得u,v在一个环内,则这种加边方式是合法的,此时的值为环的长度,所有合法的加边方式出现的概率相等,问值的期望。
2 <= n,m <= 10^5
对于u,v原来路径上的边一定在环内,贡献为1,新加的边也一定在环内,贡献为1,求其余的边的贡献就行了
分2种情况考虑:
1.lca(u,v) 不等于u 和 v
2.lca(u,v) 为u 或者 v
代码:
//File Name: cf629E.cpp
//Created Time: 2017年01月05日 星期四 17时20分29秒 #include <bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN = + ;
int siz[MAXN],dis[MAXN];
int pa[MAXN][];
LL f[MAXN],g[MAXN];
vector<int> G[MAXN];
void dfs0(int u,int p){
siz[u] = ;
dis[u] = dis[p] + ;
f[u] = ;
for(int i=;i<G[u].size();++i){
int v = G[u][i];
if(v == p) continue;
pa[v][] = u;
dfs0(v,u);
siz[u] += siz[v];
f[u] += f[v] + siz[v];
}
}
void dfs1(int u,int p,int n){
for(int i=;i<G[u].size();++i){
int v = G[u][i];
if(v == p) continue;
g[v] = n + g[u] - * siz[v];
dfs1(v,u,n);
}
}
void cal_pa(int n){
for(int j=;(<<j)<=n;++j){
for(int i=;i<=n;++i){
if(pa[i][j-] != -)
pa[i][j] = pa[pa[i][j-]][j-];
}
}
}
int cal_lca(int a,int b){
if(dis[a] < dis[b]) swap(a,b);
int cnt = ;
for(;(<<cnt)<=dis[a];++cnt);
--cnt;
for(int j=cnt;j>=;--j){
if(dis[a] - (<<j) >= dis[b])
a = pa[a][j];
}
if(a == b) return a;
for(int j=cnt;j>=;--j){
if(pa[a][j] != - && pa[a][j] != pa[b][j])
a = pa[a][j],b = pa[b][j];
}
return pa[a][];
}
int cal(int u,int v){
int cnt = ;
for(;(<<cnt)<=dis[u];++cnt);
--cnt;
for(int j=cnt;j>=;--j){
if(dis[u] - (<<j) > dis[v])
u = pa[u][j];
}
return u;
}
void solve(int n,int m){
memset(pa,-,sizeof(pa));
dfs0(,); //dis,siz,in,f,pa[i][0],dep
g[] = f[];
dfs1(,,n); //g
cal_pa(n); // pa
int u,v,lca,w;
while(m--){
scanf("%d %d",&u,&v);
lca = cal_lca(u,v);
if(lca != u && lca != v){
int tmp = dis[u] + dis[v] - * dis[lca] + ;
double ans = tmp + (f[u] + 0.0) / siz[u] + (f[v] + 0.0) / siz[v];
printf("%.15f\n",ans);
}
else{
if(lca == u) swap(u,v);
w = cal(u,v);
if(pa[w][] != v){
printf("-1");
return ;
}
int tmp = dis[u] - dis[v] + ;
double ans = tmp + (f[u] + 0.0) / siz[u] + (g[v] - f[w] - siz[w] + 0.0) / (n - siz[w]);
printf("%.15f\n",ans);
}
}
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=,u,v;i<n;++i){
scanf("%d %d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
solve(n,m);
return ;
}
codeforces E. Famil Door and Roads 期望的更多相关文章
- Codeforces Round #343 (Div. 2) E. Famil Door and Roads lca 树形dp
E. Famil Door and Roads 题目连接: http://www.codeforces.com/contest/629/problem/E Description Famil Door ...
- codeforces 629C Famil Door and Brackets (dp + 枚举)
题目链接: codeforces 629C Famil Door and Brackets 题目描述: 给出完整的括号序列长度n,现在给出一个序列s长度为m.枚举串p,q,使得p+s+q是合法的括号串 ...
- Codeforces GYM 100876 J - Buying roads 题解
Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...
- Codeforces Round #343 (Div. 2) E. Famil Door and Roads (树形dp,lca)
Famil Door's City map looks like a tree (undirected connected acyclic graph) so other people call it ...
- Codeforces 629 E. Famil Door and Roads
题目链接:http://codeforces.com/problemset/problem/629/E 询问这个简单环的期望.考虑将这个环拆成两部分. 令${deep[x]>=deep[y]}$ ...
- Codeforces Round #343 (Div. 2) E. Famil Door and Roads
题目链接: http://www.codeforces.com/contest/629/problem/E 题解: 树形dp. siz[x]为x这颗子树的节点个数(包括x自己) dep[x]表示x这个 ...
- Codeforces 839C Journey - 树形动态规划 - 数学期望
There are n cities and n - 1 roads in the Seven Kingdoms, each road connects two cities and we can r ...
- Codeforces Gym 100338C C - Important Roads tarjan
C - Important RoadsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contes ...
- Codeforces 123E Maze(树形DP+期望)
[题目链接] http://codeforces.com/problemset/problem/123/E [题目大意] 给出一棵,给出从每个点出发的概率和以每个点为终点的概率,求出每次按照dfs序从 ...
随机推荐
- 解决Tomcat7“At least one JAR was scanned for TLDs yet contained no TLDs”问题
解决Tomcat7“At least one JAR was scanned for TLDs yet contained no TLDs”问题 2013-12-05 21:58:00| 分类: t ...
- iOS8: Ignore manifest download, already have bundleID
在企业分发的app下载过程中,iOS8发现挂在官网上的企业版的app点击了提示是否安装应用程序,但始终安装不上程序,的device console发现安装的时候出现 LoadExternalDownl ...
- Resharp注册码
admin@youbaozang.comSpFEMUSrPM0AGupqlNs6J1Ey7HrjpJZy admin@wuleba.comd6GuozPm+bsCmPOtyJ2w1ggRnCr3Vk5 ...
- 模拟Post请求
此文摘自csdn青山的博客地址:http://blog.csdn.net/a497785609/article/details/6437154 本人随笔只为方便自己查阅,也为广大网友提供方便,不喜勿喷 ...
- 个人Web工具箱&资源整理(1)
很久就想把使用的工具及收藏的资源整理一番:一是为了传达博客社区的理念:资源共享,而是方便自己及团队快速获取. 学习资源: 首推两个入门级在线参考网站. 1 w3c school. 2 Runoob.c ...
- 简单的URL解析
简单的URL解析,直接举例说明了 function getUrl(){ //如果存在则取到来后面的参数,注意,?不需要取出,substring从1开始,否则取""; var qs ...
- javascript原始数据类型compareto引用数据类型--近3天不太会的地方
ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型,拥有方法的类型和不能拥有方法的类型,还可以分为可变类型和不可变类型,其实这些叫法都是依据这两 ...
- 创建 Transact-SQL 作业步骤
创建 Transact-SQL 作业步骤 在对象资源管理器中,连接到 SQL Server 数据库引擎实例,再展开该实例. 展开"SQL Server 代理",创建一个新作业或右键 ...
- rtmp转m3u8
不是所有的地址改成这样都能播 需要自己测试 先说一下rtmp的其中rtmp的常见的差不多是3种 1.一种是wowza服务器的 比如这个地址rtmp://116.55.245.135:8096/live ...
- ios系统(苹果手机)按钮显示为圆角和渐变的问题
按钮在安卓手机上显示正常,但在苹果手机上会显示如下: 解决办法:给该按钮的样式加上:-webkit-appearance:none;这样按钮就会显示正常