Description

某天WJMZBMR学习了一个神奇的算法:树的点分治!
这个算法的核心是这样的:
消耗时间=0
Solve(树 a)
消耗时间 += a 的 大小
如果 a 中 只有 1 个点
退出
否则在a中选一个点x,在a中删除点x
那么a变成了几个小一点的树,对每个小树递归调用Solve
我们注意到的这个算法的时间复杂度跟选择的点x是密切相关的。
如果x是树的重心,那么时间复杂度就是O(nlogn)
但是由于WJMZBMR比较傻逼,他决定随机在a中选择一个点作为x!
Sevenkplus告诉他这样做的最坏复杂度是O(n^2)
但是WJMZBMR就是不信><。。。
于是Sevenkplus花了几分钟写了一个程序证明了这一点。。。你也试试看吧^^
现在给你一颗树,你能告诉WJMZBMR他的傻逼算法需要的期望消耗时间吗?(消耗时间按在Solve里面的那个为标准)
题面

Solution

考虑一个点会被算入贡献几次,假如我们构出了一棵点分树,那么就贡献了 \(dep\) 次
那么我们考虑任意一个点对 \((x,y)\), 只有 \(y\) 在点分树上是 \(x\) 的父亲,才对 \(x\) 有 \(1\) 的贡献
并且 \(y\) 在点分树上是 \(x\) 的父亲的条件是 在原树中 \((x,y)\) 这条路径上的任意一个点都没有在分治到 \(y\) 之前被分治到
又因为一个点被随机的概率是均等的,则可以得出 \(y\) 对 \(x\) 有 \(1\) 的贡献的概率是 \(\frac{1}{dis(x,y)}\)

所以原问题转化为求 \(\sum_{i=1}^{n}\sum_{j=1}^n\frac{1}{dis(x,y)}\)
这个可以用点分治实现
设 \(t[i]\) 表示路径长度为 \(i\) 的点的数量
\(t[i]=\sum_{j=1}^{i}t[i]*t[i-j]\)
这是一个卷积的形式,可以用 \(FFT\) 优化
复杂度 \(O(n*log^2n)\)

#include<bits/stdc++.h>
using namespace std;
typedef complex<double> dob;
const int N=240005;const double pi=acos(-1.0);
int n,nxt[N<<1],to[N<<1],num=0,head[N],rt;
int son[N]={N},sz[N],sum;bool vis[N];
inline void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
inline void getroot(int x,int last){sz[x]=1;son[x]=0;for(int i=head[x];i;i=nxt[i]){int u=to[i];if(u==last || vis[u])continue;getroot(u,x);sz[x]+=sz[u];son[x]=max(son[x],sz[u]);}son[x]=max(son[x],sum-sz[x]);if(son[x]<son[rt])rt=x;
}
int st[N],top=0,t[N],s[N],h[N],dis[N];
inline void dfs(int x,int last,int val){s[val]++;st[++top]=x;dis[x]=val;for(int i=head[x];i;i=nxt[i]){int u=to[i];if(u==last || vis[u])continue;dfs(u,x,val+1);}
}
namespace FFT{int n,L=0,R[N];inline void FFT(dob *A,int o){for(int i=0;i<n;i++)if(i<R[i])swap(A[i],A[R[i]]);for(int i=1;i<n;i<<=1){dob wn(cos(pi/i),sin(pi/i*o)),x,y;for(int j=0;j<n;j+=(i<<1)){dob w(1,0);for(int k=0;k<i;k++,w*=wn){x=A[j+k];y=w*A[j+k+i];A[j+k]=x+y;A[j+k+i]=x-y;}}}}inline void mul(dob *A,int len){for(n=1,L=0;n<=len;n<<=1)L++;for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));FFT(A,1);for(int i=0;i<=n;i++)A[i]*=A[i];FFT(A,-1);A[0]=0;for(int i=1;i<=n;i++)h[i]=(int)(A[i].real()/n+0.5),A[i]=0;}
}
dob A[N];
inline void calc(int x,int op,int val){top=0;dfs(x,x,val+1);int len=(sz[x]+1)<<1;for(int i=1;i<=top;i++)A[dis[st[i]]]=s[dis[st[i]]];FFT::mul(A,len);for(int i=1;i<=len;i++)t[i]+=h[i+1]*op;for(int i=1;i<=top;i++)s[dis[st[i]]]--;
}
inline void solve(int x){vis[x]=1;getroot(x,x);calc(x,1,0);for(int i=head[x];i;i=nxt[i]){int u=to[i];if(vis[u])continue;getroot(u,x);calc(u,-1,1);rt=0;sum=sz[u];getroot(u,x);solve(rt);}
}
int main(){freopen("pp.in","r",stdin);freopen("pp.out","w",stdout);int x,y;scanf("%d",&n);for(int i=1;i<n;i++){scanf("%d%d",&x,&y);x++;y++;link(x,y);link(y,x);}rt=0;sum=n;getroot(1,1);solve(rt);double ans=0;for(int i=1;i<=n;i++)ans+=1.0*t[i]/i;printf("%.4lf\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Yuzao/p/8505927.html

bzoj 3451 Normal相关推荐

  1. 3451: Tyvj1953 Normal 点分治 FFT

    国际惯例的题面: 代价理解为重心和每个点这个点对的代价.根据期望的线性性,我们枚举每个点,计算会产生的ij点对的代价即可. 那么,i到j的链上,i必须是第一个被选择的点. 对于i来说,就是1/dis( ...

  2. 【bzoj 1754】【POJ - 2389 】Bull Math (高精度运算)

    题干: Bulls are so much better at math than the cows. They can multiply huge integers together and get ...

  3. PyTorch | 通过torch.normal()创建概率分布的张量 | torch.normal()如何使用?torch.normal()使用方法 | torch.normal()例子

    在公众号[计算机视觉联盟]后台回复[9076]获取独家200页手推AI笔记:我的微信:PursueWin:    --by Sophia 中科院学霸 | 上市AI算法工程师 | CSDN博客专家 通过 ...

  4. pytorch系列 -- 9 pytorch nn.init 中实现的初始化函数 uniform, normal, const, Xavier, He initialization...

    本文内容: 1. Xavier 初始化 2. nn.init 中各种初始化函数 3. He 初始化 torch.init https://pytorch.org/docs/stable/nn.html ...

  5. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  6. Oracle开发:normal ,sysdba,sysoper区别

    Oracle将用户分成两类:[system]和[sys] [system]用户只能用normal身份登陆em.(可以看成公司的普通成员) [sys]用户具有"SYSDBA"(可以看 ...

  7. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  8. (曲率系列2:)Paper6:Curvature Estimation of 3D Point Cloud Surfaces Through the Fitting of Normal

    文献下载链接:https://download.csdn.net/download/m0_37957160/12919965 简单说明原理就是:用一个点邻域内点的法向量计算该点的法曲率,根据欧拉公式得 ...

  9. Pcl:Normal的定义结构及输出

    1. pcl::Normal在pcl官网中的定义  /*brief A point structure representing normal coordinates and the surface ...

  10. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

最新文章

  1. [三层架构+WCF]三层架构+WCF实现TaskVision
  2. BUGKU 密码题:这不是摩斯密码
  3. 网易云推出了一组程序猿の真实写照【文末有彩蛋】
  4. Spring Boot 笔记汇总
  5. Maven学习总结(52)——Maven 配置文件密码加密机制使用说明
  6. 03-17 APP自动遍历测试技术
  7. QuickWAP实现网页跳转
  8. win98 支持html5,win98支持1G以上内存的解决办法
  9. 计算机学院微信公众平台,智慧校园管理,一个微信公众号搞定
  10. web漏洞扫描器原理_基于指纹识别的漏洞扫描设计
  11. iOS面试题大全(附带答案)
  12. oracle 更改system.dbf,oracle数据文件system01.dbf上有坏块,如何修复
  13. 内蒙古12333注册链接不上服务器,内蒙古12333登录
  14. 分布式技术(6) 后端接口设计方案
  15. qq2018旧版本7.3.1下载_QQ旧版本2018下载
  16. 火车采集器采集ajax,火车头采集器JavaScript之ajax网站采集实例教程
  17. 行业了解——挂耳咖啡
  18. 2018“百度之星”程序设计大赛 - 复赛 1003 带劲的and和(位运算,很好的题)
  19. 最新弹幕播放器源码/支持对接苹果+蓝光接口API
  20. 45个python入门案例_4牛-三博股票学习网

热门文章

  1. 华翼宽带android客户端,太凶残了:电信推华翼宽带专门防蹭网
  2. 2021-08-20JSP内置对象及作用域
  3. 2021-07-01事件绑定
  4. IDEA java 运行程序 指定运行参数
  5. 使用悲观锁还是乐观锁
  6. html与css游戏开发工具,分享15个最佳的HTML/CSS设计和开发框架
  7. SpringMVC学习(五)处理前端的请求参数及数据回显
  8. SelectionKey 说 明
  9. RocketMQ Client 编码快速入门 与 可视化控制台
  10. 小D课堂 - 新版本微服务springcloud+Docker教程_4-04 高级篇幅之服务间调用之负载均衡策略调整实战...