BSOJ5932题解

整个年级好像就我不会做,退役算了。

\(f[i]\) 表示从 \(i\) 除法第一次走到 \(i\) 的父亲节点的期望,\(g[i]\) 表示从 \(i\) 的父亲节点出发第一次到达 \(i\) 的期望。

\(d[u]\)\(u\) 的度数,那么有:

\[f[u]=\frac{1+\sum_{v\in son(u)}f[u]+f[v]+1}{d[u]} \]

\[g[u]=\frac{1+g[fa[u]]+g[u]+1+\sum_{v\in son(fa[u])\and v\ne u}f[v]+g[u]+1}{d[fa[u]]} \]

我们现在只需要求出链上 \(f\)\(g\) 的和即可,这个容易使用前缀和。

具体推一下:

\[f[u]=\frac{d[u]-1}{d[u]}\times f[u]+\frac{\sum_{v\in son(u)}f[v]}{d[u]}+1 \]

\[f[u]=d[u]+\sum_{v\in son(u)}f[v] \]

\[g[u]=\frac{d[fa[u]]-1}{d[fa[u]]}\times g[u]+\frac{g[fa[u]]+\sum_{v\in son(fa[u])\and v\ne u}f[v]}{d[fa[u]]}+1 \]

\[g[u]=d[fa[u]]+g[fa[u]]+\sum_{v\in son(u)\and v\ne u}f[v] \]

随便乱 DP 一下做完了。

#include<cstdio>
#include<cctype>
const int M=1e5+5,mod=1e9+7;
int n,m,ege,h[M],F[M],G[M],S[M],S1[M],S2[M],du[M];int f[M],d[M],siz[M],son[M],top[M];
struct Edge{
	int v,nx;
}e[M<<1];
inline void Add(const int&u,const int&v){
	e[++ege]=(Edge){v,h[u]};h[u]=ege;++du[u];
	e[++ege]=(Edge){u,h[v]};h[v]=ege;++du[v];
}
inline void DFS1(const int&u){
	siz[u]=1;d[u]=d[f[u]]+1;
	for(int v,E=h[u];E;E=e[E].nx)if((v=e[E].v)^f[u])f[v]=u,DFS1(v),siz[u]+=siz[v],siz[v]>siz[son[u]]&&(son[u]=v);
}
inline void DFS2(const int&u,const int&tp){
	top[u]=tp;if(!son[u])return;DFS2(son[u],tp);
	for(int E=h[u];E;E=e[E].nx)if(e[E].v^f[u]&&e[E].v^son[u])DFS2(e[E].v,e[E].v);
}
inline void DFSX(const int&u){
	for(int v,E=h[u];E;E=e[E].nx)if((v=e[E].v)^f[u])DFSX(v),S[u]=(S[u]+F[v])%mod;F[u]=(S[u]+du[u])%mod;
}
inline void DFSY(const int&u){
	for(int v,E=h[u];E;E=e[E].nx)if((v=e[E].v)^f[u])G[v]=(1u*mod+du[u]+G[u]+S[u]-F[v])%mod,DFSY(v);
}
inline void init(const int&u){
	S1[u]=(S1[f[u]]+F[u])%mod;S2[u]=(S2[f[u]]+G[u])%mod;for(int E=h[u];E;E=e[E].nx)if(e[E].v^f[u])init(e[E].v);
}
inline int LCA(int u,int v){
	while(top[u]^top[v])d[top[u]]>d[top[v]]?u=f[top[u]]:v=f[top[v]];return d[u]>d[v]?v:u;
}
inline int read(){
	int n(0);char s;while(!isdigit(s=getchar()));while(n=n*10+(s&15),isdigit(s=getchar()));return n;
}
inline void write(int n){
	static char s[15];int top(0);while(s[++top]=n%10^48,n/=10);while(putchar(s[top]),--top);putchar(10);
}
signed main(){
	n=read();m=read();for(int u,v,i=1;i<n;++i)u=read(),v=read(),Add(u,v);DFS1(1);DFS2(1,1);DFSX(1);DFSY(1);init(1);
	while(m--){
		int u,v,lca;u=read();v=read();lca=LCA(u,v);write((2u*mod+S1[u]+S2[v]-S1[lca]-S2[lca])%mod);
	}
}
posted @ 2022-08-12 14:53  Prean  阅读(18)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};