zoukankan      html  css  js  c++  java
  • 一本通1775:梦中漫步

    链接

    (x)(y) 上的点按序为 (a_1,a_2,cdots ,a_k),则 (ans(x,y)=sumlimits_{i=1}^{n-1}{ans(a_i,a_{i+1})})

    所以需要求出 (f_i) : (i)(fa_i) 的 期望步数, (g_i) : (fa_i)(i) 的期望步数。

    (f_u=frac{1}{deg_u}+sumlimits_{v in son_u}{frac{f_v+f_u+1}{deg_u}})

    ( herefore f_u=deg_u+sumlimits_{v in son_u}{f_v})

    (g_u=frac{1}{deg_{fa_u}}+frac{g_{fa_u}+g_u+1}{deg_{fa_u}}+sumlimits_{v in son_{fa_u},v ot= u}{frac{f_v+g_u+1}{deg_{fa_u}}})

    ( herefore g_u=deg_{fa_u}+g_{fa_u}+sumlimits_{v in son_{fa_u},v ot= u}{f_v})

    #include<bits/stdc++.h>
    #define IL inline
    #define LL long long
    using namespace std;
    const int N=1e5+3,p=1e9+7;
    struct hh{
    	int to,nxt;
    	}e[N<<1];
    int n,m,num,fir[N],f[N],g[N],fa[N],son[N],siz[N],dep[N],deg[N],dis1[N],dis2[N],top[N];
    IL int in(){
    	char c;int f=1;
    	while((c=getchar())<'0'||c>'9')
    		if(c=='-') f=-1;
    	int x=c-'0';
    	while((c=getchar())>='0'&&c<='9')
    		x=x*10+c-'0';
    	return x*f;
    	}
    IL void add(int x,int y){e[++num]=(hh){y,fir[x]},fir[x]=num;}
    IL int mod(int x){return x>=p?x-p:x;}
    void dfs1(int u,int F){
    	fa[u]=F,dep[u]=dep[F]+1,siz[u]=1,f[u]=deg[u];
    	for(int i=fir[u],v;v=e[i].to;i=e[i].nxt)
    		if(v^F){
    			dfs1(v,u),siz[u]+=siz[v],f[u]=mod(f[u]+f[v]);
    			if(siz[son[u]]<siz[v]) son[u]=v;
    			}
    	}
    void dfs2(int u,int fa){
    	int sum=0;
    	for(int i=fir[u],v;v=e[i].to;i=e[i].nxt)
    		if(v^fa) sum=mod(sum+f[v]);
    	for(int i=fir[u],v;v=e[i].to;i=e[i].nxt)
    		  if(v^fa) g[v]=mod(deg[u]+mod(g[u]+mod(sum-f[v]+p))),dfs2(v,u);
    	}
    void dfs3(int u,int fa,int t){
    	top[u]=t,dis1[u]=mod(dis1[fa]+f[u]),dis2[u]=mod(dis2[fa]+g[u]);
    	if(son[u]) dfs3(son[u],u,t);
    	for(int i=fir[u],v;v=e[i].to;i=e[i].nxt)
    		if(v^fa&&v^son[u]) dfs3(v,u,v);
      }
    IL int get_lca(int x,int y){
    	while(top[x]^top[y]) dep[top[x]]<dep[top[y]]?y=fa[top[y]]:x=fa[top[x]];
    	return dep[x]<dep[y]?x:y;
    	}
    int main()
    {
    	int x,y,z;
    	n=in(),m=in();
    	for(int i=1;i<n;++i)
    		x=in(),y=in(),++deg[x],++deg[y],
    		add(x,y),add(y,x);
    	dfs1(1,0),f[1]=0,dfs2(1,0),dfs3(1,0,1);
    	while(m--){
    		x=in(),y=in(),z=get_lca(x,y);
    		printf("%d
    ",mod(mod(dis1[x]-dis1[z]+p)+mod(dis2[y]-dis2[z]+p)));
    		}
    	return 0;
    	}
    
  • 相关阅读:
    Linux kernel AACRAID Driver Compat IOCTL 本地安全绕过漏洞
    WordPress Contact Form 7插件任意文件上传漏洞
    文件上传
    Po类设计
    MySQL 表设计
    Mybatis——更新DB表的字段时,应该注意的点
    分页——为Mybatis配置PageHelper
    SpringAOP配置与使用(示例)
    日志问题
    为一台全新的电脑构建JavaEE开发环境
  • 原文地址:https://www.cnblogs.com/yiqiAtiya/p/13928341.html
Copyright © 2011-2022 走看看