题意

  给出一个 \(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. linux下mysql定时备份,数据保存周期一周

    以下脚本来自网络,版权归原作者所有(推荐放在夜间自动备份,用cron制定计划任务) crontab -e 0 3 * * * /var/erp/data/mysql_backup.sh #!/bin/ ...

  2. H5本地存储技术

    H5 Web存储技术 前言 web存储技术在初期的时候被定义为HTML5的一部分作为其API.后来被独立出来作为一份独立的标准. web存储标准包含localStorage对象和sessionStor ...

  3. KVM虚拟化网络管理(4)

    一.Linux Bridge网桥管理 网络虚拟化是虚拟化技术中最复杂的部分,也是非常重要的资源.第一节中我们创建了一个名为br0的linux-bridge网桥,如果在此网桥上新建一台vm,如下图: V ...

  4. Java严选

    1,假如有两个线程,一个线程A,一个线程B都会访问一个加锁方法,可能存在并发情况,但是线程B访问频繁,线程A访问次数很少,问如何优化.(然后面试官说有了解过重度锁和轻度锁吗) a,竞争资源不激烈,选择 ...

  5. VisualBasic文件与目录管理FileSystem 类

    注解 下表列出了涉及 My.Computer.FileSystem 对象的任务示例. 功能 查看 从文本文件读取 如何:读取文本文件 从带分隔符的文本文件中读取 如何:读取逗号分隔的文本文件 从固定宽 ...

  6. node项目自动化部署--基于Jenkins,Docker,Github(3)自动化部署

    GitHub仓库 由于现在的代码基本上都是多人合作开发,所以肯定会用到像 git 这样的版本控制工具 所以这里使用 GitHub 来做一个演示 首先我们需要在github上新建一个仓库 点击New来新 ...

  7. Configure脚本支持说明

    在Linux上安装Nginx需要执行Configure脚本,该脚本需要做一些参数说明: 选项 说明 --prefix=<path> 指定Nginx软件的安装路径,若不指定默认安装在/usr ...

  8. C++多线程基础学习笔记(一)

    下面分三个方面多线程技术的必须掌握一些基本知识. 1.进程 2.线程 3.并发 (1)进程 一个可执行程序运行起来了,即为创建了一个进程.如在电脑上打开了word,就创建了一个word进程,打开QQ, ...

  9. Hive 教程(五)-参数配置

    配置基本操作 hive> set; 查看所有配置hive> set key: 查看某个配置hive> set key value: 设置某个配置 我们可以看到一些 hadoop 的配 ...

  10. 使用GPU训练TensorFlow模型

    查看GPU-ID CMD输入: nvidia-smi 观察到存在序号为0的GPU ID 观察到存在序号为0.1.2.3的GPU ID 在终端运行代码时指定GPU 如果电脑有多个GPU,Tensorfl ...