luogu CF804D Expected diameter of a tree |Tarjan+樹的直徑+前綴和+二分查找
时间:2020-04-13
本文章向大家介绍luogu CF804D Expected diameter of a tree |Tarjan+樹的直徑+前綴和+二分查找,主要包括luogu CF804D Expected diameter of a tree |Tarjan+樹的直徑+前綴和+二分查找使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意翻译
给一片森林,\(q\)个询问,每个询问两个点,问将这两个点所在的集合连接起来组成的新集合,它的最远两点的距离的期望值是多少。
調了2個小時,終於好啦
求出每個聯通快直徑的兩端點
預處理每個點到最遠的點的距離
排序,前綴和,快速計算
#include<map>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
#define int long long
#define db double
inline int read(){
int x=0; char c=getchar();
while(c<'0'||c>'9')c=getchar();
while('0'<=c&&c<='9'){ x=(x<<1)+(x<<3)+(c^48); c=getchar(); }
return x;
}
int nxt[N<<1],head[N],go[N<<1],tot;
inline void add(int u,int v){
nxt[++tot]=head[u],head[u]=tot,go[tot]=v;
nxt[++tot]=head[v],head[v]=tot,go[tot]=u;
}
int n,m,q;
bool vis[N];
int dfn[N],low[N],co[N],st[N],si[N],top,col,num;
void Tarjan(int u){
st[++top]=u;
dfn[u]=low[u]=++num;
for(int i=head[u];i;i=nxt[i]){
int v=go[i];
if(!dfn[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
}else if(!co[v])
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
co[u]=++col;
si[col]=1;
while(st[top]!=u){
co[st[top]]=col;
si[col]++;
--top;
}
--top;
}
}
int dis[N],all[N],coin[N],p,Max;
void dfs(int u,int fa){
if(dis[u]>Max)Max=dis[u],p=u;
all[u]=max(all[u],dis[u]);
for(int i=head[u];i;i=nxt[i]){
int v=go[i];
if(v==fa)continue;
dis[v]=dis[u]+1;
dfs(v,u);
}
}
inline void findp(int u){
p=Max=-1; dfs(u,u); coin[co[u]]=max(coin[co[u]],Max);
Max=-1; dis[p]=0; dfs(p,p); coin[co[u]]=max(coin[co[u]],Max);
Max=-1; dis[p]=0; dfs(p,p); coin[co[u]]=max(coin[co[u]],Max);
}
vector<int>belong[N],Sum[N],e[N];
map<pair<int,int>,db>IF;
signed main(){
n=read(),m=read(),q=read();
for(int i=1;i<=m;i++)add(read(),read());
for(int i=1;i<=n;i++)if(!dfn[i])Tarjan(i);
for(int i=1;i<=n;i++){
if(!vis[co[i]])findp(i),vis[co[i]]=1;
belong[co[i]].push_back(i);
}
for(int i=1;i<=col;i++){
for(int j=0;j<belong[i].size();j++)
e[i].push_back(all[belong[i][j]]);
sort(e[i].begin(),e[i].end());
for(int j=0;j<belong[i].size();j++){
Sum[i].push_back(e[i][j]);
if(j)Sum[i][j]+=Sum[i][j-1];
}
}
int x,y;
while(q--){
x=read(),y=read();
int a=co[x],b=co[y];
if(a==b){ printf("-1\n"); continue;}
if(IF[make_pair(a,b)]>0)
{ printf("%.9f\n",IF[make_pair(a,b)]); continue; }
if(si[a]>si[b])swap(a,b);
int ans=0,op=belong[a].size()*belong[b].size();
int MAXN=max(coin[a],coin[b]);
for(int i=0;i<e[a].size();i++){
int A=e[a][i]+1;
int mzx=upper_bound(e[b].begin(),e[b].end(),MAXN-A)-e[b].begin();
ans+=MAXN*mzx;
if(mzx==0)ans+=A*e[b].size()+Sum[b][Sum[b].size()-1];
else ans+=A*(e[b].size()-mzx)+Sum[b][Sum[b].size()-1]-Sum[b][mzx-1];
}
db res=(db)ans/op;
IF[make_pair(b,a)]=IF[make_pair(a,b)]=res;
printf("%.10f\n",res);
}
}
原文地址:https://www.cnblogs.com/naruto-mzx/p/12693052.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一起来学matlab-matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色
- 一起来学matlab-matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象
- PHP 如何阻止用户上传成人照片或者裸照
- 一起来学matlab-字符串操作 10_4 MATLAB中的字符串表示
- 一起来学演化计算-matlab优化函数fminunc
- 一起来学matlab-matlab学习笔记10 10_1一般运算符
- 每日手撕一道算法题-20. 有效的括号
- 一起来学matlab-数组取值 MATLAB中的字符串符号
- 递归解决遍历问题
- PHP中的include和require
- 一起来学matlab-matlab学习笔记10 10_2一般操作符和数据显示格式
- 一起来学matlab-matlab学习笔记10 10_3关系运算符和逻辑运算符
- 一篇文章学懂Shell脚本,最简明的教程在这里
- 一起来学matlab-matlab学习笔记10 10_5 通用字符串操作和比较函数
- 一个案例彻底弄懂如何正确使用 mysql inndb 联合索引