题意

  给出一个 \(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. H5本地存储技术

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

  2. MATLAB实现OTSU

    目录 1.OTSU算法原理简述: 2.MATLAB实现代码 @ 1.OTSU算法原理简述: 最大类间方差是由日本学者大津(Nobuyuki Otsu)于1979年提出,是一种自适应的阈值确定方法.算法 ...

  3. Win7主题存放路径详解

    WIN7用户主题--- 自定义主题  首先当然是用户自定义的主题文件夹,这个文件夹一般是存放在下面这个路径(注意那个用户名改成你自己的登陆名喔,比如 administrator) C:\Users\用 ...

  4. idea、eclipse常用快捷键

    idea常用快捷键 Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Shift+Click,可以 ...

  5. postman Tests断言

    摘要:关于postman的断言方法很多,在网上随便搜寻下,能搜出一大推,什么牛鬼蛇神都有,让人眼花缭乱..甚至在应用时出现错误.Test断言都是根据js规则来写的,对于我这种不懂js语言的来说确实不友 ...

  6. (转) pip Fatal error in launcher: Unable to create process using

    接上篇“Eclipse启动报错:JVM terminated. Exit code=2”,今天把Python的安装位置也从C盘剪切到了D盘, 然后修改了Path环境变量中对应的盘符:D:\Python ...

  7. Java中流的操作练习

    文件中的学生信息 学生信息存储在TXT文件中,我们需要对信息进行基本的,增.删.改.查,全部显示操作. 1.学生类/Student package com.yujiao.student; public ...

  8. 搭建本地parcel仓库

    参考:https://www.cloudera.com/documentation/enterprise/6/6.2/topics/cm_ig_create_local_parcel_repo.htm ...

  9. vim 文档加密

    众所周知vim的加密方法是 :X 解密为输入:X后直接回车两次 注意此时必须使用:wq来保存,:x和shift+zz(ZZ)均无法保存此更改 此时注意 :wq"与":x" ...

  10. luoguP3390(矩阵快速幂模板题)

    链接:https://www.luogu.org/problemnew/show/P3390 题意:矩阵快速幂模板题,思路和快速幂一致,只需提供矩阵的乘法即可. AC代码: #include<c ...