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)\),设 \( ...
随机推荐
- C#异步,多线程下的HttpContext丢失问题
1.思路概述 首先让我把大概的一个思路先说一遍吧. 我在一个页面中要同时调用两个接口,而我要给这些接口一些参数:就是我通过HttpContext.Current.Request.QueryString ...
- SpringMVC 工作原理详解
本文Github开源项目https://github.com/Snailclimb/JavaGuide,只供自己学习总结无商业用途,如有侵权,联系删除 先来看一下什么是 MVC 模式 MVC 是一种设 ...
- 虚拟机VMware workstations的网络设置
一般遇到虚拟机中上不了网的问题,可以这样解决: 1.在终端输入命令:ifconfig.--查看eth0接口上是否有IP地址. 发现eth0接口上没有ip地址. 2.输入cat /etc/sysconf ...
- MVC 使用Quartz.Net组件实现定时计划任务
最近,项目中需要执行一个计划任务,组长就让我了解一下Quartz.net 这个组件,挺简单的一个组件,实现起来特别的方便,灵活,值得推荐给大家一起学习一下这个小工具.以前我有的时候是使用定时器Time ...
- java工程师_基础_阶段一_HTML笔记篇
一.了解HTML语言 html:超文本标记语言. 二.HTML整体结构<html> <head> </head> <body> </body> ...
- csharp:获取 DNS、网关、子网掩码、IP
/// <summary> /// DNS.网关.子网掩码.IP /// 涂聚文 2015 /// </summary> public class IPAddressStrin ...
- 转:php中判断某个IP地址是否存在范围内
原文:php中判断某个IP地址是否存在范围内 //案例:判断192.168.1.127是否在 (192.168.1.1--192.168.1.255)的范围里面 $ip_start = get_ipl ...
- 自己编写jQuery插件 之 无缝滚动
一. 效果图 二. Html骨架结构 <div class="box"> <ul> <li>1</li> <li>2&l ...
- <Android 基础(二十九)> Fragment (2) ~ DialogFragment
简介 上一篇简单的介绍了下Fragment的使用方法,这一篇主要看下DialogFragment. 在android 3.0时被引入.是一种特殊的Fragment,用于在Activity的内容之上展示 ...
- 全功能开发团队(FSD)