首页 > 其他分享 >SDU Open 2023-F、树上随机游走

SDU Open 2023-F、树上随机游走

时间:2023-10-06 20:37:21浏览次数:34  
标签:SDU int sum LCA son fa 2023 Open MOD

SDU Open 2023-F、树上随机游走

题目:https://codeforces.com/group/2altttv8oU/contest/477604/problem/F

题意:给定一棵 \(n\) 个点的无根树,在树上随机游走(即每次会从当前点等概率地走到一个相邻结点),\(q\) 次询问,每次问从 \(s\) 走到 \(t\) 的期望步数。

\(1\leq n,q\leq 2\times 10^5\)。


题解:

虽然不算难,但感觉是个很有意思的题。

首先要明确的一点是,从父亲走到儿子,和从儿子走到父亲是两种不同的情况,因此应该是先从 \(s\) 走到 \(LCA(s,t)\) ,再从 \(LCA(s,t)\) 走下去,这要分两段考虑。

设 \(f_x\) 表示从 \(x\) 走到父亲的期望步数,假设点 \(x\) 的度是 \(deg_x\) ,那么有\(p=1/deg_x\) 的概率走到每个相邻的点。考虑走一步之后,有 \(p\) 的概率直接走到父亲,以及剩下的情况等概率走到每个孩子,对于这些情况需要先从孩子走上来,再从 \(x\) 到父亲 ,即:

\[f_x=1+\sum_{v\in son_x}p\times (f_x+f_v)=1+(1-p) f_x+p\cdot \sum_{v\in son _x} f_v \]

得到

\[f_x=\frac{1}{p}+\sum_{v\in son_x} f_v \]

类似地考虑 \(g_x\) 表示从 \(x\) 的父亲走到 \(x\) 的期望步数,\(fa[x]\) 表示 \(x\) 的父亲,\(p=1/deg_{fa[x]}\) ,则从 \(fa[x]\) 出发,有 \(p\) 的概率走到\(fa[fa[x]]\),此时需要再走到 \(fa[x]\) 需要期望 \(g_{fa[x]}\) 步,以及另外有概率走到 \(x\) 的兄弟结点,则

\[\begin{aligned} g_x&=1+ p(g_{fa[x]}+g_x)+\sum_{v\in son_{fa[x]},v\neq x}p(g_x+f_v)\\ &=1+(1-p)g_x+p\cdot g_{fa[x]}+g\cdot \sum_{v\in son_{fa[x]},v\neq x}f_v \end{aligned} \]

化简得到

\[g_x=\frac{1}{p}+g_{fa[x]}+\sum_{v\in son_x,v\neq x}f_v \]

两个dp都可以用 \(O(n)\) 的树dp完成。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define endl '\n'
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
const int N=2e5+5;
const int MOD=998244353;
void add(ll &x,ll y){x+=y;if(x>=MOD)x-=MOD;}
int n,q,fa[N],deg[N];
ll f[N],g[N];
vector<vector<int>> G;

namespace LCA{
	int sz[N],fa[N],top[N],dep[N],son[N];
	void dfs1(int x){
		sz[x]=1;
		for(auto to:G[x])if(to!=fa[x]){
			dep[to]=dep[x]+1;
			fa[to]=x;dfs1(to);
			sz[x]+=sz[to];
			if(sz[to]>sz[son[x]])son[x]=to;
		}
	}
	void dfs2(int x,int t){
		top[x]=t;
		if(son[x])dfs2(son[x],t);
		for(auto to:G[x])if(to!=fa[x]&&to!=son[x])dfs2(to,to);
	}
	int lca(int a,int b){
		while(top[a]!=top[b]){
			if(dep[top[a]]<dep[top[b]])swap(a,b);
			a=fa[top[a]];
		}
		if(dep[a]<dep[b])swap(a,b);
		return b;
	}
};
void dfs1(int x){
	f[x]=deg[x];
	for(auto to:G[x])if(to!=fa[x]){
		fa[to]=x;
		dfs1(to);
		add(f[x],f[to]);
	}
}
void dfs2(int x){
	ll sum=0;
	for(auto to:G[x])if(to!=fa[x])add(sum,f[to]);
	for(auto to:G[x])if(to!=fa[x])
		g[to]=(deg[x]+g[x]+sum-f[to]+MOD)%MOD;
}
int main(){
	fastio;
	cin>>n>>q;
	G=vector<vector<int>>(n+1);
	rep(i,1,n-1){
		int u,v;
		cin>>u>>v;
		G[u].push_back(v);
		G[v].push_back(u);
		deg[u]++;deg[v]++;
	}
	dfs1(1);dfs2(1);
	rep(i,1,n)if(fa[i])add(f[i],f[fa[i]]),add(g[i],g[fa[i]]);
	LCA::dfs1(1);LCA::dfs2(1,1);
	rep(i,1,q){
		int a,b;cin>>a>>b;
		int L=LCA::lca(a,b);
		ll ans=((f[a]-f[L]+MOD)%MOD+(g[b]-g[L]+MOD)%MOD)%MOD;
		cout<<ans<<endl;
	}
	return 0;
}

标签:SDU,int,sum,LCA,son,fa,2023,Open,MOD
From: https://www.cnblogs.com/yoshinow2001/p/17744956.html

相关文章

  • 2023年石门中学NOIP模拟测试(2023.10.6)
    原题大战T1范围\(n\leq10^{14}\)。不用动脑,打个表找找规律。考虑一个数\(x\),在\(1\simn\)中包含\(x\)这个约数的个数为\(\left\lfloor\dfrac{n}{x}\right\rfloor\),那么既然是异或,只需要判断奇偶性算贡献即可。然后你发现这玩意显然可以整除分块,算连续一段贡献,只需......
  • openGauss学习笔记-91 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-M
    openGauss学习笔记-91openGauss数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT外部支持工具为了支持MOT,修改了以下外部openGauss工具。请确保使用的工具是最新版本。下面将介绍与MOT相关的用法。有关这些工具及其使用方法的完整说明,请参阅《工具与命令参考》。91......
  • 2023牛客国庆集训派对day8/牛客2020年暑期多校day8
    Preface妈的多校都是些什么题啊,一场比赛后三小时全程啥也干不了只能划划水,最后开榜就看手速排名,给他唐完了这场开场和前期久违地顺利,按难度开了三道签到后队里讨论了下秒出了A的正解我爬上去摸了会虽然nt错误频发WA了两发,但后面还是成功抢到了A题的一血,同时徐神和祁神坐在下面......
  • SDU Open 2023-H、几何、积分、单调栈维护上凸壳
    SDUOpen2023-H、几何、积分、单调栈维护上凸壳题目:https://codeforces.com/gym/104324/problem/H题意:有\(n\)个信号基站,你在边玩手机边走路,手机会自动连接到最近的基站。单位时间花费的流量是到基站距离的平方,现在从起点沿着直线走到终点,并且走的都是横平竖直的直线,单位时间......
  • 2023-2024-1学号20231407陈原《计算机基础与程序设计》第一周学习总结
    这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求是什么2023-2024-1计算机基础与程序设计第一周作业这个作业的目的是什么简单浏览《计算机概论》,提出疑问,并尝试解决问题    作业正文 https://www.cnblogs.com/CCCY12345/p/17744827.ht......
  • 20231006
    20231006NOIP#16(33daiOJ)总结时间安排7:40~8:00看题,\(A\)一眼切了,\(B\)会两档,\(C,D\)没想法。8:00~8:20写\(A\)的正解。8:20~8:40写\(B\)的\(30pts\)。8:40~8:50原来算错了\(C\)的爆搜复杂度,现在写了\(C\)的第一档。8:50~9:20会了\(D\)链的特殊性质写了......
  • 2023-2024-1 20231428《计算机基础与程序设计》第一周学习总结
           这个作业属于哪个课程2023-2024-1-计算机基础与程序设计            作业要求https://www.cnblogs.com/rocedu/p/9577842.html#WEEK01          这个作业的目标快速阅读教材,初步了解所学内容 ......
  • P9140 [THUPC 2023 初赛] 背包
    prologue这很难评(调了我1h,我都想紫砂了。还是典型得不重构就看不见系列。analysis如果我们还是一个正常人,那么我们大体上是能看到题目的加粗字,这个格式很明显符合我们的同余最短路的格式。(如若不知,请先出门直走)然后我们就要考虑这个同余最短路的实现。这个题目不同于往常......
  • 2023-10-06
    一、第一次直接就焊MCU了,C8T6都焊的乌漆嘛黑的,再也不用松香了。SMT报价发BOM和Gerber过去,总共遥控和核心板2块贴片,不包含运费物料。要600大洋。。。。。 二、买了块练习板,又买了几块C8T6,总不可能焊坏100次。1.MCU焊接方法:所有焊点上锡,点焊法。  2.小元器件贴片:焊点上锡......
  • 武汉大学2023年新生程序设计竞赛(同步赛)
    C.覆叶之交(线段树+离散化+扫描线)输入格式:输出格式:输入00230032-1-111输出11说明线段树+离散化+扫描线#include<bits/stdc++.h>#defineIOSios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr)#definelowbit(ver)ver&(-ver)......