tyvj1953 Normal
正解:点分治+$FFT$。
很想吐槽一下$bzoj$,为什么搬了别的$oj$的题还设成权限题。。
首先我们考虑期望的线性性,即考虑每个点的贡献。
显然每个点的贡献就是它在点分树上的深度,所以我们进一步考虑哪些点在它到根的路径上。
我们考虑每一条路径的贡献,显然对于一条路径$(x,y)$,当且仅当$x$是路径上最浅的点时会对$y$有$1$的贡献。
那么这条路径$x$深度最浅的概率,实际上就是$\frac{1}{len(x,y)}$,因为每个点作为深度最浅的点的概率相等。
所以我们统计每一种长度的路径个数就行了,这个用$FFT$即可解决。
#include <bits/stdc++.h>
#define il inline
#define RG register
#define ll long long
#define N (1000005) using namespace std; struct edge{ int nt,to; }g[N];
struct C{
double x,y;
il C operator + (const C &a) const{
return (C){x+a.x,y+a.y};
}
il C operator - (const C &a) const{
return (C){x-a.x,y-a.y};
}
il C operator * (const C &a) const{
return (C){x*a.x-y*a.y,x*a.y+y*a.x};
}
}a[N]; const double pi=acos(-1.0); int head[N],vis[N],dis[N],son[N],sz[N],rev[N],n,num,len,Max;
double ans[N],Ans; il int gi(){
RG int x=,q=; RG char ch=getchar();
while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return q*x;
} il void insert(RG int from,RG int to){
g[++num]=(edge){head[from],to},head[from]=num; return;
} il void fft(C *a,RG int n,RG int f){
for (RG int i=;i<n;++i) if (i<rev[i]) swap(a[i],a[rev[i]]);
for (RG int i=;i<n;i<<=){
C wn=(C){cos(pi/i),sin(f*pi/i)};
for (RG int j=;j<n;j+=i<<){
C w=(C){,},x,y;
for (RG int k=;k<i;++k,w=w*wn){
x=a[j+k],y=w*a[j+k+i];
a[j+k]=x+y,a[j+k+i]=x-y;
}
}
}
if (f==-) for (RG int i=;i<len;++i) a[i].x/=n; return;
} il void getrt(RG int x,RG int p,RG int &rt){
son[x]=,sz[x]=;
for (RG int i=head[x],v;i;i=g[i].nt){
v=g[i].to; if (v==p || vis[v]) continue;
getrt(v,x,rt),sz[x]+=sz[v],son[x]=max(son[x],sz[v]);
}
son[x]=max(son[x],son[]-sz[x]);
if (son[rt]>=son[x]) rt=x; return;
} il void getdis(RG int x,RG int p){
sz[x]=,++a[dis[x]].x,Max=max(Max,dis[x]);
for (RG int i=head[x],v;i;i=g[i].nt){
v=g[i].to; if (v==p || vis[v]) continue;
dis[v]=dis[x]+,getdis(v,x),sz[x]+=sz[v];
}
return;
} il void calc(RG int rt,RG int lim,RG int fg){
Max=,dis[rt]=lim,getdis(rt,); RG int lg=;
for (len=;len<=(Max<<);len<<=) ++lg;
for (RG int i=;i<len;++i) rev[i]=rev[i>>]>>|((i&)<<(lg-));
fft(a,len,); for (RG int i=;i<len;++i) a[i]=a[i]*a[i]; fft(a,len,-);
for (RG int i=;i<len;++i) ans[i]+=(ll)(a[i].x+0.5)*fg,a[i]=(C){,}; return;
} il void solve(RG int x,RG int S){
RG int rt=; son[]=S,getrt(x,,rt);
vis[rt]=,calc(rt,,);
for (RG int i=head[rt];i;i=g[i].nt)
if (!vis[g[i].to]) calc(g[i].to,,-);
for (RG int i=head[rt];i;i=g[i].nt)
if (!vis[g[i].to]) solve(g[i].to,sz[g[i].to]);
return;
} int main(){
#ifndef ONLINE_JUDGE
freopen("normal.in","r",stdin);
freopen("normal.out","w",stdout);
#endif
n=gi();
for (RG int i=,u,v;i<n;++i)
u=gi()+,v=gi()+,insert(u,v),insert(v,u);
solve(,n);
for (RG int i=;i<n;++i) Ans+=1.0*ans[i]/(i+);
printf("%0.4lf\n",Ans); return ;
}
tyvj1953 Normal的更多相关文章
- BZOJ3451: Tyvj1953 Normal
题解: 好神的一道题.蒟蒻只能膜拜题解. 考虑a对b的贡献,如果a是a-b路径上第一个删除的点,那么给b贡献1. 所以转化之后就是求sigma(1/dist(i,j)),orz!!! 如果不是分母的话 ...
- bzoj 3451: Tyvj1953 Normal [fft 点分治 期望]
3451: Tyvj1953 Normal 题意: N 个点的树,点分治时等概率地随机选点,代价为当前连通块的顶点数量,求代价的期望值 百年难遇的点分治一遍AC!!! 今天又去翻了一下<具体数学 ...
- 【BZOJ3451】Tyvj1953 Normal 点分治+FFT+期望
[BZOJ3451]Tyvj1953 Normal Description 某天WJMZBMR学习了一个神奇的算法:树的点分治!这个算法的核心是这样的:消耗时间=0Solve(树 a) 消耗时间 += ...
- BZOJ3451 Tyvj1953 Normal 点分治 多项式 FFT
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3451.html 题目传送门 - BZOJ3451 题意 给定一棵有 $n$ 个节点的树,在树上随机点分 ...
- 3451: Tyvj1953 Normal 点分治 FFT
国际惯例的题面:代价理解为重心和每个点这个点对的代价.根据期望的线性性,我们枚举每个点,计算会产生的ij点对的代价即可.那么,i到j的链上,i必须是第一个被选择的点.对于i来说,就是1/dis(i,j ...
- [BZOJ3451][Tyvj1953]Normal(点分治+FFT)
https://www.cnblogs.com/GXZlegend/p/8611948.html #include<cmath> #include<cstdio> #inclu ...
- 【BZOJ 3451】Tyvj1953 Normal 思维题+期望概率+FFT+点分治
我感觉是很强的一道题……即使我在刷专题,即使我知道这题是fft+点分治,我仍然做不出来……可能是知道是fft+点分治限制了我的思路???(别做梦了,再怎样也想不出来的……)我做这道题的话,一看就想单独 ...
- 【bzoj3451】Tyvj1953 Normal 期望+树的点分治+FFT
题目描述 给你一棵 $n$ 个点的树,对这棵树进行随机点分治,每次随机一个点作为分治中心.定义消耗时间为每层分治的子树大小之和,求消耗时间的期望. 输入 第一行一个整数n,表示树的大小接下来n-1行每 ...
- BZOJ3451:Tyvj1953 Normal
根据期望的线性性,答案就是 \(\sum\) 每个连通块出现次数的期望 而每个连通块次数的期望就是 \(\sum\) 连通块的根与每个点连通次数的期望 也就是对于一条路径 \((i,j)\),设 \( ...
随机推荐
- CSS3 transition 过度
一个元素在不同的状态之间进行平滑的交换 CSS3中使用transition属性实现过度效果 一个简单的例子: img{ background-image:url("img/1.jpg&quo ...
- java编写带头结点的单链表
最近在牛客网上练习在线编程,希望自己坚持下去,每天都坚持下去练习,给自己一个沉淀,不多说了 我遇到了一个用java实现单链表的题目,就自己在做题中将单链表完善了一下,希望大家作为参考也熟悉一下,自己 ...
- httpServletRequest中的流只能读取一次的原因
首先,我们复习一下InputStream read方法的基础知识, java InputStream read方法内部有一个,postion,标志当前流读取到的位置,每读取一次,位置就会移动一次,如果 ...
- JAVA非静态成员变量之死循环
1.非静态成员变量 当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环 例子: public class ConstructorCls { private ConstructorCls ...
- win10 安装 oracle 11g 时遇到 [INS-13001] 环境不满足最低要求 的问题
前言:自己系统上安装 oracle 时报错,故记录下来. 环境: win10 x64 oracle 11g 安装包 出错: 解决方案:同 https://www.cnblogs.com/yuxiaol ...
- 小tip:FireFox下文本框/域百分比padding bug解决——张鑫旭
一.问题描述 我是流体布局控,经常会遇到文本框以及文本域宽度100%自适应显示的情况. 如下效果图: 在窄屏下,上面的文本框宽度也要跟着外部宽度变小. 难点对于文本框或者文本域,光标最好距离左侧边缘有 ...
- egg.js-基于koa2的node.js入门
一.Egg.JS 简介 Egg.JS是阿里开发的一套node.JS的框架,主要以下几个特点: Egg 的插件机制有很高的可扩展性,一个插件只做一件事,Egg 通过框架聚合这些插件,并根据自己的业务场景 ...
- 前端AMD、CMD和commonJs-前端知识
前端AMD和CMD是在模块化的基础上产生并且得到大幅度的引用的. AMD 即Asynchronous Module Definition(点击链接可以查看AMD面试题),中文名是异步模块定义的意思.它 ...
- <VS2010>混合模式程序集是针对“v2.0”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集
在把以前写的代码生成工具从原来的.NET3.5升级到.NET4.0时,将程序集都更新后,一运行程序在一处方法调用时报出了一个异常: 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有 ...
- 热血沙城-3.2移植-古月-cocos2dx源码
最近发现我去年学习2dx的时候移植过的一个游戏现在被放在网上出售 真是有点想笑 本人比较喜欢武侠风格的游戏,当时9秒开源了热血沙城 本着学习的态度 从2.1.2移植到3.2 用了一周的时间 中间各种 ...