P11736 [集训队互测 2015] 胡策的小树

题意

给定一棵 n 个点的树,保证 i 的父亲在 1i1 中随机。

初始每个节点上有一枚棋子,每一时刻开始,sum 为 0。对于每个棋子,设其所在位置为 i,有 pi=ain 的概率向父亲走,并使 sum 加 1;或者等概率的跳到 i 子树内的点。特殊的,p1 恒为 0。保证 ai0n1 的排列。

现在要进行这些操作 T=(n+1)999999999999999 个时刻,设 ans 为每个时刻 sum 值的平均数的平均数的期望,即:ans=E(i=0TsuminT)

你现在可以进行一次操作:i,ai(ai+x)modn。求 ans 最大值。

n5×105

分析

考虑 x=0 的情况,即不进行操作。

fi 为某一时刻 i 点上的猴子个数平均数的期望(即猴子个数期望除以 n 的值)。可以证明,当 T 足够大时,fi 最终稳定在一个定值上,且 fi 不稳定时对答案的贡献可以忽略,所以我们可以直接把答案写成 fipi 的形式。

考虑怎么求 fi,显然有递推式 fx=uson(x)fupu+uanc(x)fu(1pu)1sizu。直接高消复杂度 O(n3),不能通过。

考虑树上高消,那么我们就需要求出 fiffa 的等量关系了(一般情况下 fu=kffa+b)。有式子

usubtree(x)fu=usubtree,uxfu+uanc(x)fu(1pu)sizxsizu

两边同时减去 usubtree(x),uxfu

fx=uanc(x)fu(1pu)sizxsizu=fx(1px)+sizxsizfauanc(x),uxfu(1pu)sizfasizu

而不难发现 uanc(x),uxfu(1pu)sizfasizu=ffa,代入并移项得:

pxfx=sizxsizfaffa

这样就得出了 fxffa 的等量关系,dfs 一遍就可以求出所有 fif1 的等量关系,然后由于一共有 n 只猴子,所以 ifi=1,据此可以求解出 f1 的值,继而得出 fi 的值。时间复杂度 O(n)

考虑 x0 的情况。此时必定存在一个 ai=0 的点,那么对于该点子树以外的棋子,一旦棋子掉落到 i 子树内就再也出不来了。而在 T 足够大时,最终所有棋子都会落在 i 子树内(子树外的贡献可以忽略不计),然后对于 i 子树内当成一棵树做 x=0 即可。因为树形态随机,所以时间复杂度 O(isizi)=O(nlogn)

int n,a[maxn];
vector<int>G[maxn];
int root[maxn];
int siz[maxn];
vector<int>v[maxn];
int fa[maxn];
double f[maxn],p[maxn];
double sum,res;
int dfn[maxn],dfncnt,nfd[maxn];
void dfs0(int x){
	dfn[x]=++dfncnt,nfd[dfncnt]=x,siz[x]=1;
	for(int u:G[x])dfs0(u),siz[x]+=siz[u];
}
void dfs(int x){
	sum+=f[x],res+=f[x]*p[x];
	for(int u:G[x]){
		f[u]=f[x]*siz[u]/siz[x]/p[u];
		dfs(u);
	}
}
double solve(int d){
	const int rt=root[d];
	sum=res=0,f[rt]=1;
	rep(i,dfn[rt],dfn[rt]+siz[rt]-1){
		const int u=nfd[i];
		p[u]=1.0*((a[u]+d)%n)/n;
	}
	dfs(rt);
	return res/sum;
}
inline void solve_the_problem(){
	n=rd();
	rep(i,1,n)fa[i]=rd(),G[fa[i]].emplace_back(i);
	rep(i,1,n)a[i]=rd(),root[(n-a[i])%n]=i;
	dfs0(1);
	double ans=0;
	rep(i,0,n-1)ckmx(ans,solve(i));
	printf("%.12lf",ans);
}

作者:dcytrl

出处:https://www.cnblogs.com/dcytrl/p/18720577

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   dcytrl  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示