题目链接

正解:点分治+$FFT$。

很想吐槽一下$bzoj$,为什么搬了别的$oj$的题还设成权限题。。

首先我们考虑期望的线性性,即考虑每个点的贡献。

显然每个点的贡献就是它在点分树上的深度,所以我们进一步考虑哪些点在它到根的路径上。

我们考虑每一条路径的贡献,显然对于一条路径$(x,y)$,当且仅当$x$是路径上最浅的点时会对$y$有$1$的贡献。

那么这条路径$x$深度最浅的概率,实际上就是$\frac{1}{len(x,y)}$,因为每个点作为深度最浅的点的概率相等。

所以我们统计每一种长度的路径个数就行了,这个用$FFT$即可解决。

  1. #include <bits/stdc++.h>
  2. #define il inline
  3. #define RG register
  4. #define ll long long
  5. #define N (1000005)
  6.  
  7. using namespace std;
  8.  
  9. struct edge{ int nt,to; }g[N];
  10. struct C{
  11. double x,y;
  12. il C operator + (const C &a) const{
  13. return (C){x+a.x,y+a.y};
  14. }
  15. il C operator - (const C &a) const{
  16. return (C){x-a.x,y-a.y};
  17. }
  18. il C operator * (const C &a) const{
  19. return (C){x*a.x-y*a.y,x*a.y+y*a.x};
  20. }
  21. }a[N];
  22.  
  23. const double pi=acos(-1.0);
  24.  
  25. int head[N],vis[N],dis[N],son[N],sz[N],rev[N],n,num,len,Max;
  26. double ans[N],Ans;
  27.  
  28. il int gi(){
  29. RG int x=,q=; RG char ch=getchar();
  30. while ((ch<'' || ch>'') && ch!='-') ch=getchar();
  31. if (ch=='-') q=-,ch=getchar();
  32. while (ch>='' && ch<='') x=x*+ch-'',ch=getchar();
  33. return q*x;
  34. }
  35.  
  36. il void insert(RG int from,RG int to){
  37. g[++num]=(edge){head[from],to},head[from]=num; return;
  38. }
  39.  
  40. il void fft(C *a,RG int n,RG int f){
  41. for (RG int i=;i<n;++i) if (i<rev[i]) swap(a[i],a[rev[i]]);
  42. for (RG int i=;i<n;i<<=){
  43. C wn=(C){cos(pi/i),sin(f*pi/i)};
  44. for (RG int j=;j<n;j+=i<<){
  45. C w=(C){,},x,y;
  46. for (RG int k=;k<i;++k,w=w*wn){
  47. x=a[j+k],y=w*a[j+k+i];
  48. a[j+k]=x+y,a[j+k+i]=x-y;
  49. }
  50. }
  51. }
  52. if (f==-) for (RG int i=;i<len;++i) a[i].x/=n; return;
  53. }
  54.  
  55. il void getrt(RG int x,RG int p,RG int &rt){
  56. son[x]=,sz[x]=;
  57. for (RG int i=head[x],v;i;i=g[i].nt){
  58. v=g[i].to; if (v==p || vis[v]) continue;
  59. getrt(v,x,rt),sz[x]+=sz[v],son[x]=max(son[x],sz[v]);
  60. }
  61. son[x]=max(son[x],son[]-sz[x]);
  62. if (son[rt]>=son[x]) rt=x; return;
  63. }
  64.  
  65. il void getdis(RG int x,RG int p){
  66. sz[x]=,++a[dis[x]].x,Max=max(Max,dis[x]);
  67. for (RG int i=head[x],v;i;i=g[i].nt){
  68. v=g[i].to; if (v==p || vis[v]) continue;
  69. dis[v]=dis[x]+,getdis(v,x),sz[x]+=sz[v];
  70. }
  71. return;
  72. }
  73.  
  74. il void calc(RG int rt,RG int lim,RG int fg){
  75. Max=,dis[rt]=lim,getdis(rt,); RG int lg=;
  76. for (len=;len<=(Max<<);len<<=) ++lg;
  77. for (RG int i=;i<len;++i) rev[i]=rev[i>>]>>|((i&)<<(lg-));
  78. fft(a,len,); for (RG int i=;i<len;++i) a[i]=a[i]*a[i]; fft(a,len,-);
  79. for (RG int i=;i<len;++i) ans[i]+=(ll)(a[i].x+0.5)*fg,a[i]=(C){,}; return;
  80. }
  81.  
  82. il void solve(RG int x,RG int S){
  83. RG int rt=; son[]=S,getrt(x,,rt);
  84. vis[rt]=,calc(rt,,);
  85. for (RG int i=head[rt];i;i=g[i].nt)
  86. if (!vis[g[i].to]) calc(g[i].to,,-);
  87. for (RG int i=head[rt];i;i=g[i].nt)
  88. if (!vis[g[i].to]) solve(g[i].to,sz[g[i].to]);
  89. return;
  90. }
  91.  
  92. int main(){
  93. #ifndef ONLINE_JUDGE
  94. freopen("normal.in","r",stdin);
  95. freopen("normal.out","w",stdout);
  96. #endif
  97. n=gi();
  98. for (RG int i=,u,v;i<n;++i)
  99. u=gi()+,v=gi()+,insert(u,v),insert(v,u);
  100. solve(,n);
  101. for (RG int i=;i<n;++i) Ans+=1.0*ans[i]/(i+);
  102. printf("%0.4lf\n",Ans); return ;
  103. }

tyvj1953 Normal的更多相关文章

  1. BZOJ3451: Tyvj1953 Normal

    题解: 好神的一道题.蒟蒻只能膜拜题解. 考虑a对b的贡献,如果a是a-b路径上第一个删除的点,那么给b贡献1. 所以转化之后就是求sigma(1/dist(i,j)),orz!!! 如果不是分母的话 ...

  2. bzoj 3451: Tyvj1953 Normal [fft 点分治 期望]

    3451: Tyvj1953 Normal 题意: N 个点的树,点分治时等概率地随机选点,代价为当前连通块的顶点数量,求代价的期望值 百年难遇的点分治一遍AC!!! 今天又去翻了一下<具体数学 ...

  3. 【BZOJ3451】Tyvj1953 Normal 点分治+FFT+期望

    [BZOJ3451]Tyvj1953 Normal Description 某天WJMZBMR学习了一个神奇的算法:树的点分治!这个算法的核心是这样的:消耗时间=0Solve(树 a) 消耗时间 += ...

  4. BZOJ3451 Tyvj1953 Normal 点分治 多项式 FFT

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3451.html 题目传送门 - BZOJ3451 题意 给定一棵有 $n$ 个节点的树,在树上随机点分 ...

  5. 3451: Tyvj1953 Normal 点分治 FFT

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

  6. [BZOJ3451][Tyvj1953]Normal(点分治+FFT)

    https://www.cnblogs.com/GXZlegend/p/8611948.html #include<cmath> #include<cstdio> #inclu ...

  7. 【BZOJ 3451】Tyvj1953 Normal 思维题+期望概率+FFT+点分治

    我感觉是很强的一道题……即使我在刷专题,即使我知道这题是fft+点分治,我仍然做不出来……可能是知道是fft+点分治限制了我的思路???(别做梦了,再怎样也想不出来的……)我做这道题的话,一看就想单独 ...

  8. 【bzoj3451】Tyvj1953 Normal 期望+树的点分治+FFT

    题目描述 给你一棵 $n$ 个点的树,对这棵树进行随机点分治,每次随机一个点作为分治中心.定义消耗时间为每层分治的子树大小之和,求消耗时间的期望. 输入 第一行一个整数n,表示树的大小接下来n-1行每 ...

  9. BZOJ3451:Tyvj1953 Normal

    根据期望的线性性,答案就是 \(\sum\) 每个连通块出现次数的期望 而每个连通块次数的期望就是 \(\sum\) 连通块的根与每个点连通次数的期望 也就是对于一条路径 \((i,j)\),设 \( ...

随机推荐

  1. C#异步,多线程下的HttpContext丢失问题

    1.思路概述 首先让我把大概的一个思路先说一遍吧. 我在一个页面中要同时调用两个接口,而我要给这些接口一些参数:就是我通过HttpContext.Current.Request.QueryString ...

  2. SpringMVC 工作原理详解

    本文Github开源项目https://github.com/Snailclimb/JavaGuide,只供自己学习总结无商业用途,如有侵权,联系删除 先来看一下什么是 MVC 模式 MVC 是一种设 ...

  3. 虚拟机VMware workstations的网络设置

    一般遇到虚拟机中上不了网的问题,可以这样解决: 1.在终端输入命令:ifconfig.--查看eth0接口上是否有IP地址. 发现eth0接口上没有ip地址. 2.输入cat /etc/sysconf ...

  4. MVC 使用Quartz.Net组件实现定时计划任务

    最近,项目中需要执行一个计划任务,组长就让我了解一下Quartz.net 这个组件,挺简单的一个组件,实现起来特别的方便,灵活,值得推荐给大家一起学习一下这个小工具.以前我有的时候是使用定时器Time ...

  5. java工程师_基础_阶段一_HTML笔记篇

    一.了解HTML语言 html:超文本标记语言. 二.HTML整体结构<html> <head> </head> <body> </body> ...

  6. csharp:获取 DNS、网关、子网掩码、IP

    /// <summary> /// DNS.网关.子网掩码.IP /// 涂聚文 2015 /// </summary> public class IPAddressStrin ...

  7. 转:php中判断某个IP地址是否存在范围内

    原文:php中判断某个IP地址是否存在范围内 //案例:判断192.168.1.127是否在 (192.168.1.1--192.168.1.255)的范围里面 $ip_start = get_ipl ...

  8. 自己编写jQuery插件 之 无缝滚动

    一. 效果图 二. Html骨架结构 <div class="box"> <ul> <li>1</li> <li>2&l ...

  9. <Android 基础(二十九)> Fragment (2) ~ DialogFragment

    简介 上一篇简单的介绍了下Fragment的使用方法,这一篇主要看下DialogFragment. 在android 3.0时被引入.是一种特殊的Fragment,用于在Activity的内容之上展示 ...

  10. 全功能开发团队(FSD)