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序从 ...
随机推荐
- 视音频技术作业一:比较CCD与CMOS摄像的区别
作业详解: CCD与CMOS简介: CCD: CCD是Charge Coupled Device(电荷耦合器件)的缩写,它是一种半导体成像器件,因而具有灵敏度高.抗强光.畸变小.体积小.寿命长.抗震动 ...
- 用python+selenium抓取微博24小时热门话题的前15个并保存到txt中
抓取微博24小时热门话题的前15个,抓取的内容请保存至txt文件中,需要抓取排行.话题和阅读数 #coding=utf-8 from selenium import webdriver import ...
- 关于mongoDB的思考和nodeJS执行windows系统命令
P1:在cnodejs.org上面看到有人问这个问题: 然后对此产生思考,第一句db.artile.find('uid':id) 然后问后台是否是这样查询,后台告诉我不是,这种写法就是违背非关系型数据 ...
- iOS Orientation bug
Every September means pain for iOS developers- you need to make sure your old apps/code run on the n ...
- CLR via C# 3rd - 02 - Building, Packaging, Deploying, and Administering Applications and Types
1. C# Compiler - CSC.exe csc.exe /out:Program.exe /t:exe /r:MSCorLib.dll Program.cs ...
- Can only set Cookies for the current domain
# -*- coding: utf-8 -*- """ Created on Mon Dec 12 14:35:49 2016 @author: yaru "& ...
- log4g
org.apache.log4j.Logger 详解 1. 概述 1.1. 背景 在应用程序中添加日志记录总的来说基于三个目的 :监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工 ...
- 《C专家编程》第三章——分析C语言的声明
前面一章我们已经说过C语言存在的一些问题和它晦涩的地方,让我们对这门神奇的语言有了更深的了解.现在这一章则集中精力来讨论C语言的声明,分为三块,首先是说明C语言声明晦涩难懂的原因和声明是如何形成的,其 ...
- hiho一下21周 线段树的区间修改 离散化
离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho ...
- 各种模板(part 2)
堆: using namespace dui //堆 { #include<queue> //需要的库 priority_queue < int > Q; //定义一个Q的大根 ...