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序从 ...
随机推荐
- iOS--难倒一大片的问题
// // main.m // 10.27***** // // Created by on 15/10/27. // Copyright (c) 2015年 . All rights re ...
- C++学习笔记26:泛型编程概念
一.什么是泛型编程? 泛型就是通用的型式 编写不依赖数据对象型式的代码就是泛型编程 二.为什么需要泛型编程? 函数重载,相似类定义与型式兼容性 例如:设计函数,求两个数据对象的较小值 //未明确规定参 ...
- OpenStack虚拟机DHCP获取不到IP地址排查
版本:OpenStack Liberty Neutron DVR 现象: 1.在虚拟机内部不停地dhclient 2.在虚拟机所属的计算节点的物理网卡上抓包,发现该虚拟机发出的dhcp广播包 3.在虚 ...
- 华为U8810的用户如何获取ROOT权限详细教程
由于在论坛里看到有人在找这个手机的详细的root教程,所以刷机啦小编在这里整理了一下方便新手来操作,其实这个手机root起来还是蛮简单的,只需要一个root软件就可以了,相当于一键root了,在这里整 ...
- C#使用quartz.net定时问题
因工作需要需要完成定时查询数据..因此在了解之后完成了一个demo 所需要的dll在该地址下载 http://pan.baidu.com/s/1sjNQLXV 首先引入quartz这个dll... 在 ...
- jquery 中的 offset()
一.语法: 1.返回偏移坐标 $(select).offset(); top: $(select).offset().top; left: $(select).offset().left; 2.设 ...
- POJ 1014 Dividing
Dividing Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 66032 Accepted: 17182 Descriptio ...
- HttpUtility.UrlDecode
如果在 HTTP 流中传递如空格或者标点符号等字符,它们可能会错误地解释在接收端. URL 编码转换为字符实体等效项; 不允许在 URL 中的字符URL 解码反转的编码. 例如,在嵌入到要在 URL ...
- Java框架重量级,轻量级的问题?
一般认为,SSH为重量级.SSI为轻量级. 但轻重的概念怎么界定?
- 初识Linux-4
1,文件系统,从/开始的树状结构 2,绝对路径:/打头,相对路径:从当前目录下开始的 3,usename,passwd,uid,gid,home,shell(都是管理员指定的,这些信息都在passwd ...