jzoj 4890. 【NOIP2016提高A组集训第14场11.12】随机游走 树上期望dp
来源:互联网 发布:java环境变量一键配置 编辑:程序博客网 时间:2024/05/16 05:38
题意
给出一棵树,每条边的长度为1,。若现在位于节点i,则每次都会等概率地走向与i相邻的点。问在所有的点对(i,j)中,从i走到j的最大期望长度是多少。
n<=100000
分析
作为一个期望毒瘤,暴力什么的根本不会啊2333~~所以比赛的时候这题就爆蛋啦。
我们设f[i,j]表示现在在节点i走到节点j且满足i和j有边直接相连的期望长度。
可以得到
化简一下可得
显然当 d[i]=1,即 i 为叶子时,f[i,j]=1. 于是设 1 为根,跑一遍 DFS,自下而上计算出所有的 f[i,fa[i]],fa[i]表示 i 的父亲。
机智的我们又可以观察到
那么很显然
那么我们就可以顺便推出
那么我们就可以求出a[x]表示x到x的子树内的最大期望距离,b[x]表示x的子树内到x的最大期望距离,然后按照顺序把x的子树到x的距离排好,然后维护一个前缀max和后缀max就可以在O(d[x])的复杂度内得到答案了。
代码
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define N 100005using namespace std;int n,last[N],d[N],f[N],g[N],a[N],b[N],c[N],mx1[N],mx2[N],cnt,ans;struct edge{int to,next;}e[N*2];void addedge(int u,int v){ e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt; e[++cnt].to=u;e[cnt].next=last[v];last[v]=cnt;}void dfs(int x,int fa){ f[x]=d[x]; for (int i=last[x];i;i=e[i].next) { if (e[i].to==fa) continue; dfs(e[i].to,x); f[x]+=f[e[i].to]; a[x]=max(a[x],a[e[i].to]+g[e[i].to]); b[x]=max(b[x],b[e[i].to]+f[e[i].to]); } int s=0; for (int i=last[x];i;i=e[i].next) c[++s]=a[e[i].to]+g[e[i].to]; mx1[0]=mx2[s+1]=0; for (int i=1;i<=s;i++) mx1[i]=max(mx1[i-1],c[i]); for (int i=s;i>=1;i--) mx2[i]=max(mx2[i+1],c[i]); int s1=0; for (int i=last[x];i;i=e[i].next) { if (e[i].to==fa) continue; s1++; ans=max(ans,b[e[i].to]+f[e[i].to]+max(mx1[s1-1],mx2[s1+1])); } g[x]=n*2-2-f[x];}int main(){ freopen("rw.in","r",stdin);freopen("rw.out","w",stdout); scanf("%d",&n); for (int i=1;i<n;i++) { int x,y; scanf("%d%d",&x,&y); addedge(x,y); d[x]++;d[y]++; } dfs(1,0); printf("%d.00000",ans); return 0;}
0 0
- jzoj 4890. 【NOIP2016提高A组集训第14场11.12】随机游走 树上期望dp
- 【NOIP2016提高A组集训第14场11.12】随机游走——期望+树形DP
- 4890. 【NOIP2016提高A组集训第14场11.12】随机游走 (2017.10B组)
- 【NOIP2016提高A组集训第14场11.12】随机游走
- JZOJ4890. 【NOIP2016提高A组集训第14场11.12】随机游走
- 【JZOJ4890】【NOIP2016提高A组集训第14场11.12】随机游走
- 【NOIP2016提高A组集训第14场11.12】随机游走
- 【NOIP2016提高A组集训第14场11.12】随机游走
- jzoj 4887. 【NOIP2016提高A组集训第13场11.11】最大匹配 树形dp
- NOIP2016提高A组集训第14场11.12 总结
- jzoj 4832. 【NOIP2016提高A组集训第3场10.31】高维宇宙 网络流或状压dp
- JZOJ 4823. 【NOIP2016提高A组集训第1场10.29】小W学物理
- JZOJ 4822. 【NOIP2016提高A组集训第1场10.29】完美标号
- JZOJ 4822. 【NOIP2016提高A组集训第1场10.29】完美标号
- jzoj 4831. 【NOIP2016提高A组集训第3场10.31】方程式 多项式除法 数学
- jzoj 4833. 【NOIP2016提高A组集训第3场10.31】Mahjong dfs+暴力
- JZOJ 4822 【NOIP2016提高A组集训第1场10.29】完美标号
- JZOJ 4823 【NOIP2016提高A组集训第1场10.29】小W学物理
- Android匿名共享内存和MemoryFile
- 【译】SOLID:Part 2 - 开闭原则
- POJ1008 日期转换(5)
- 系统调用接口
- Session与Cookie的对比
- jzoj 4890. 【NOIP2016提高A组集训第14场11.12】随机游走 树上期望dp
- B-树
- jQuery过滤选择器——属性过滤选择器
- opencv BUG
- 二进制文件的打开
- 备战国际半程马拉松训练第一天总结
- Qbxt AH d4 && day-6
- 网络请求
- ubuntu14.04+gtx1060配置caffe