题意

  给出一个 \(n\) 个节点的树,两点之间有且仅有一条路径相连。

  给出 \(m\) 个点对 \(x_i,y_i\),如果添加一条双向边 \((u,v)\) 后 \(x_i\) 和 \(y_i\) 在一个简单环中,则称这条边是 happy 的,happy 值为这个简单环的点数。

  请你求出对于点对 \(x_i,y_i\),所有 happy 的边的 happy 值的平均数。

  注意,出题人似乎认为简单环是包括自环的。

  \(n,m\le 100000\)

题解

  什么普及组傻逼题,画个朴素的 \(x,y≠lca\) 的情况就知道是合并两棵子树的信息了,\(x=lca\) 或 \(y=lca\) 的情况同理。\(\text{dfs}\) 预处理就好。

  但是细节比较复杂,写得我要死……尤其是题目告诉你简单环包括自环,你就应该能猜到可能有 \(x_i=y_i\) 的情况了,这种情况你要 \(O(n)\) 合并若干棵子树而不是两棵子树的信息,多预处理一些信息就好了。

  考场上写+调了两个小时才 1A(没拍),自己还是太菜了,下次争取一小时 1A 吧。

#include<bits/stdc++.h>
#define int long long
#define N 100002
using namespace std;
inline int read(){
int x=0; bool f=1; char c=getchar();
for(;!isdigit(c); c=getchar()) if(c=='-') f=0;
for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
if(f) return x;
return 0-x;
}
int n,m;
struct edge{int v,nxt;}e[N<<1];
int hd[N],cnt;
inline void add(int u, int v){e[++cnt]=(edge){v,hd[u]}, hd[u]=cnt;}
int fa[N][20],dep[N];
double spcans[N]; int sum[N],siz[N],spcsum[N],spcpair[N];
void dfs1(int u, int f){
fa[u][0]=f, dep[u]=dep[f]+1, sum[u]=siz[u]=1;
for(int i=1; i<=17; ++i) fa[u][i]=fa[fa[u][i-1]][i-1];
int presum=0, presiz=0;
for(int i=hd[u]; i; i=e[i].nxt) if(e[i].v!=f){
dfs1(e[i].v,u);
sum[u]+=sum[e[i].v]+siz[e[i].v], siz[u]+=siz[e[i].v];
spcans[u]+=presum*siz[e[i].v]+sum[e[i].v]*presiz;
spcpair[u]+=siz[e[i].v]*presiz;
presum+=sum[e[i].v], presiz+=siz[e[i].v];
}
spcsum[u]=presum;
}
int outsum[N];
void dfs2(int u, int os){
outsum[u]=os;
for(int i=hd[u]; i; i=e[i].nxt) if(e[i].v!=fa[u][0])
dfs2(e[i].v, os+siz[1]-siz[u] + sum[u]-sum[e[i].v]-siz[e[i].v]);
}
int tag;
int getLca(int x, int y){
//if(dep[x]<dep[y]) swap(x,y);
if(dep[x]>dep[y]){
for(int i=17; i>=0; --i) if(dep[fa[x][i]]>dep[y]) x=fa[x][i];
tag=x, x=fa[x][0];
}
if(x==y) return x;
for(int i=17; i>=0; --i) if(fa[x][i]^fa[y][i]) x=fa[x][i], y=fa[y][i];
tag=x;
return fa[x][0];
}
signed main(){
//freopen("a.in","r",stdin);
n=read(), m=read();
int u,v;
for(int i=1; i<n; ++i) u=read(), v=read(), add(u,v), add(v,u);
dfs1(1,0), dfs2(1,0);
for(int i=1; i<=m; ++i){
u=read(), v=read();
if(dep[u]<dep[v]) swap(u,v);
int lca=getLca(u,v);
if(u==v){
//cout<<spcans[u]<<' '<<spcsum[u]<<' '<<(siz[1]-siz[u])<<' '<<outsum[u]*(siz[u]-1)<<' '<<spcsum[u]+outsum[u]<<endl;
printf("%.7lf\n", (double)(spcans[u] + spcsum[u]*(siz[1]-siz[u])+outsum[u]*(siz[u]-1) + spcsum[u]+outsum[u]) / (spcpair[u]+(siz[u]-1)*(siz[1]-siz[u]) + siz[1]) + 1);
}
else if(lca==v){
//cout<<u<<' '<<v<<' '<<sum[u]<<' '<<siz[1]-siz[tag]<<' '<<outsum[tag]<<' '<<siz[u]<<' '<<dep[u]-dep[v]<<endl;
printf("%.7lf\n", (double)(sum[u]*(siz[1]-siz[tag])+outsum[tag]*siz[u]) / ((siz[1]-siz[tag])*siz[u]) + dep[u]-dep[v]-1);
}
else{
//cout<<(double)sum[u]*siz[v]+(double)sum[v]*siz[u]/(siz[u]*siz[v])<<' '<<dep[u]<<' '<<dep[v]<<' '<<2*dep[lca]-1<<endl;
printf("%.7lf\n", (double)(sum[u]*siz[v]+sum[v]*siz[u]) / (siz[u]*siz[v]) + dep[u]+dep[v]-2*dep[lca]-1);
}
}
return 0;
}

【未知来源】Happy的更多相关文章

  1. Android系统移植与调试之------->如何修改Android系统默认显示【开发者选项】并默认打开【USB调试】和【未知来源】开关

    今天有个用户对[设置]有个特殊的要求,即: 1.开机的时候默认显示[开发者选项]并打开[USB调试]开关    ([Developer options]-->[USB debugging]) 2 ...

  2. mac 上如何安装非app store上的下载的软件-------打开未知来源

    打开了 Terminal 终端后 ,在命令提示后输入 sudo spctl --master-disable 并按下回车执行,如下图所示.   随后再输入当前 Mac 用户的密码,如下图所示.   如 ...

  3. [转帖] IPsec相关知识 --未知来源

    目  录 IPsec IPsec简介 IPsec的协议实现 IPsec基本概念 加密卡 IPsec虚拟隧道接口 使用IPsec保护IPv6路由协议 IKE IKE简介 IKE的安全机制 IKE的交换过 ...

  4. Mac 不显示未知来源选项的解决办法/连接不上网络

    原文来自百度经验: http://jingyan.baidu.com/article/eae078278b37d41fec5485b2.html 灰常感谢原作 关于mac无法连接wifi,我的解决办法 ...

  5. 安装串口设备驱动时遇到 Windows 无法验证此设备所需的驱动程序的数字签名。最近的硬件或软件更改安装的文件可能未正确签名或已损坏,或者可能是来自未知来源的恶意软件. 问题该如何处理?

    win7 系统直接在 cmd 命令行中输入以下语句,重启电脑后重新安装驱动即可. BCDEDIT -SET LOADOPTIONS DISABLE_INTEGRITY_CHECKS BCDEDIT - ...

  6. 【未知来源】Randomized Binary Search Tree

    题意 求 \(n\) 个点的 Treap 深度为 \(h=0,1,2,\cdots,n\) 的概率. Treap 是一个随机二叉树,每个节点有权值和优先级,权值和优先级都是 \([0,1]\) 中的随 ...

  7. 【未知来源】K-th String

    题意 求有多少种 前 \(n\) 个小写字母的排列 \(t\),满足其所有子串按字典序从小到大排列,第 \(k\) 个子串是一个给定字符串 \(s\).答案模 \(10^9+7\). \(1\le n ...

  8. .net core 和 WPF 开发升讯威在线客服系统:使用本地IP数据库实现访客来源快速定位,支持国外

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 免费使用 & 私有化部署:https://kf.shengxun ...

  9. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

    --iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制, ...

随机推荐

  1. Docker学习笔记 — Docker私有仓库搭建

    Docker学习笔记 — Docker私有仓库搭建   目录(?)[-] 环境准备 搭建私有仓库 测试 管理仓库中的镜像 查询 删除 Registry V2   和Mavan的管理一样,Dockers ...

  2. tween.js的API实践

    看了网上多篇关于tween的使用教程,基本上千篇一律,大多数的写法都是像下面这样: function initTween(geometry) { }; tween = }, ); tween.easi ...

  3. 关于Pytorch中accuracy和loss的计算

    这几天关于accuracy和loss的计算有一些疑惑,原来是自己还没有弄清楚. 给出实例 def train(train_loader, model, criteon, optimizer, epoc ...

  4. Leetcode之广度优先搜索(BFS)专题-279. 完全平方数(Perfect Squares)

    Leetcode之广度优先搜索(BFS)专题-279. 完全平方数(Perfect Squares) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ar ...

  5. SQL注入-预防

    输入验证: 检查用户输入的合法性,确信输入的内容只包含合法的数据.数据检查应当在客户端和服务器端都执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性. 输入验证最好使用“白名单”校验的方式. 输入 ...

  6. python笔记之列表

    python中列表使用list类. 创建一个列表:list1 = [1,2,3,4]使用逗号隔开每个元素,使用方括号包含起来,创建空列表直接使用list2 = [] #!/usr/bin/env py ...

  7. 出现错误lambda expressions are not supported at language level 7解决方法

    AS工程出现题目中的错误.解决办法: 这两个选中为1.8. 然后AS会自动在app的build.gradle下面,android{}里面增加 同时会修改app.iml文件中的如下部分,将Languag ...

  8. analyticdb(ADB) group by 用法小结

    虽说analyticdb(ADB)是支持mysql协议的,但有些具体细节用法是有些区别. 1.group by 字段 mysql group by select id,title,describe w ...

  9. [转帖]【JDK和Open JDK】平常使用的JDK和Open JDK有什么区别

    https://www.cnblogs.com/sxdcgaq8080/p/7487369.html 其实不同的 openjdk的版本也不一样. atlassian说AdoptOpenJDK我们测试充 ...

  10. git clone 报错 fatal: protocol '–https' is not supported 解决办法

    版本:git 2.22.0 系统:win7旗舰版 先把https去掉 再把https加上 神奇的事情出现了,这样就可以了. 很多人都说这样解决了,原因不知道. Administrator@BWE8QX ...