【未知来源】Happy
题意
给出一个 \(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的更多相关文章
- Android系统移植与调试之------->如何修改Android系统默认显示【开发者选项】并默认打开【USB调试】和【未知来源】开关
今天有个用户对[设置]有个特殊的要求,即: 1.开机的时候默认显示[开发者选项]并打开[USB调试]开关 ([Developer options]-->[USB debugging]) 2 ...
- mac 上如何安装非app store上的下载的软件-------打开未知来源
打开了 Terminal 终端后 ,在命令提示后输入 sudo spctl --master-disable 并按下回车执行,如下图所示. 随后再输入当前 Mac 用户的密码,如下图所示. 如 ...
- [转帖] IPsec相关知识 --未知来源
目 录 IPsec IPsec简介 IPsec的协议实现 IPsec基本概念 加密卡 IPsec虚拟隧道接口 使用IPsec保护IPv6路由协议 IKE IKE简介 IKE的安全机制 IKE的交换过 ...
- Mac 不显示未知来源选项的解决办法/连接不上网络
原文来自百度经验: http://jingyan.baidu.com/article/eae078278b37d41fec5485b2.html 灰常感谢原作 关于mac无法连接wifi,我的解决办法 ...
- 安装串口设备驱动时遇到 Windows 无法验证此设备所需的驱动程序的数字签名。最近的硬件或软件更改安装的文件可能未正确签名或已损坏,或者可能是来自未知来源的恶意软件. 问题该如何处理?
win7 系统直接在 cmd 命令行中输入以下语句,重启电脑后重新安装驱动即可. BCDEDIT -SET LOADOPTIONS DISABLE_INTEGRITY_CHECKS BCDEDIT - ...
- 【未知来源】Randomized Binary Search Tree
题意 求 \(n\) 个点的 Treap 深度为 \(h=0,1,2,\cdots,n\) 的概率. Treap 是一个随机二叉树,每个节点有权值和优先级,权值和优先级都是 \([0,1]\) 中的随 ...
- 【未知来源】K-th String
题意 求有多少种 前 \(n\) 个小写字母的排列 \(t\),满足其所有子串按字典序从小到大排列,第 \(k\) 个子串是一个给定字符串 \(s\).答案模 \(10^9+7\). \(1\le n ...
- .net core 和 WPF 开发升讯威在线客服系统:使用本地IP数据库实现访客来源快速定位,支持国外
本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 免费使用 & 私有化部署:https://kf.shengxun ...
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
--iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制, ...
随机推荐
- Selenium下Chrome配置
地址:https://peter.sh/experiments/chromium-command-line-switches/ chrome_options.add_argument('--headl ...
- JavaScript(3)——文档工具
文档工具 LEARN HTML = 教程 HTML REFERENCE = 字典 HTML + CSS + JAVASCRIPT = DYNAMIC HTML 推荐浏览器: Chrome浏览器(有丰 ...
- Beego框架的一条神秘日志引发的思考
公司目前的后台是用Beego框架搭的,并且为了服务的不中断升级,我们开启了Beego的Grace模块,用于热升级支持.一切都跑井然有序,直到有一天,领导甩出一些服务日志,告知程序一直报错: 2018/ ...
- Bug解决:mysql 创建表字段Double类型长度
excel导入数据进行新增时,发现安装高度和可视距离在数据库创建都是double类型 程序跑完,执行成功后,数据库的数据是2,小数点后的数据没有了 打印sql并执行后发现sql并没有错误, 检查数据库 ...
- Android开发 互相调用模式之导出Jar包、扩展MainActivity、Java主导
首先讲导出Jar包,在以前都是用这种方法,但是现在官方不推荐使用此方法,官方推荐导出Aar包 (1)首先创建一个Android空工程 注意:这里选择API 16,因为Unity支持的最低是API 16 ...
- 【AMAD】Stream-Framework -- 让你可以使用Cassandra和Redis构建新闻feed,活动流(activity stream)以及通知系统。
动机 简介 个人评分 动机 你曾经是否想为你自己的网站构建Facebook,Github那种feed流. 简介 通过Stream-Framework1你可以做到: Github那种活动流 Twitte ...
- [转帖]2015年时的新闻:Debian GNU/Hurd 2015 发布
Debian GNU/Hurd 2015 发布 oschina 发布于 2015年04月30日 https://www.oschina.net/news/62004/debian-gnu-hurd-2 ...
- MyBatis动态SQL第一篇之实现多条件查询(if、where、trim标签)
一.动态SQL概述 以前在使用JDBC操作数据时,如果查询条件特别多,将条件串联成SQL字符串是一件痛苦的事情.通常的解决方法是写很多的if-else条件语句对字符串进行拼接,并确保不能忘了空格或在字 ...
- Spring Boot+CXF搭建WebService服务参考资料
pom.xml文件引入包: <!--WerbService CXF依赖--> <dependency> <groupId>org.apache.cxf</gr ...
- [LGP2000] 拯救世界
6的倍数 1/(1-x^6) 最多9块 (1-x^10)/(1-x) 最多5块 (1-x^6)/(1-x) 4的倍数 1/(1-x^4) 最多7块 (1-x^8)/(1-x) 2的倍数 1/(1-x^ ...