标签:bilibili 根据 i++ || 分析 复杂 loading rom getch
新年快乐!

by もや造
有\(n\)个点,对于每个点\(i(i≤n)\)都有一条连向\(i+1\)的边,形成一条链,并在其中加入\(m\)条返祖边
现在从1号节点出发,每次等概率的前往到一个相邻的节点,求走到第\(n+1\)个点的期望步数
\(n,m≤10^6\)
设\(E_{x→y}\)表示从\(x\)点走到\(y\)点的期望步数,\(k_i\)表示第\(i\)个点的返祖边条数
有转移:
根据期望的线性性质,有\(E_{x→y} =\sum\limits_{i=x}^{y-1}E_{i→i+1}\),代回原式:
维护一下前缀和即可,\(\sum\limits_{i=x}^{y-1}E_{i→i+1}\)既为所求答案
时间复杂度\(O(n+m)\)
//xcxc82 2021/2/9/20:50 
#include<bits/stdc++.h>
#define mo 998244353
using namespace std;
const int MAXN = 1000010;
inline int read(){
	int X=0; bool flag=1; char ch=getchar();
	while(ch<‘0‘||ch>‘9‘) {if(ch==‘-‘) flag=0; ch=getchar();}
	while(ch>=‘0‘&&ch<=‘9‘) {X=(X<<1)+(X<<3)+ch-‘0‘; ch=getchar();}
	if(flag) return X;return ~(X-1);
}
struct edge{
	int to,from,next;
}e[MAXN<<2];
int head[MAXN<<2],cnt;
void add(int u,int v){
	e[++cnt].next = head[u];
	e[cnt].from = u;
	e[cnt].to = v;
	head[u] = cnt;
}
int id,n,m,out[MAXN],sum[MAXN],f[MAXN];
int main(){
    id = read(),n =read(),m = read();
	for(int i=1;i<=m;i++){
		int u = read(),v =read();
		add(u,v);
		out[u]++;
	}
	for(int u=1;u<=n;u++){
		f[u] = 1+out[u];
		for(int i=head[u];i;i=e[i].next){
			int v = e[i].to;
			f[u] = (f[u]+(sum[u-1]-sum[v-1]+mo)%mo)%mo;
		}
		sum[u] = (sum[u-1]+f[u])%mo;
	}
	printf("%d",sum[n]);
   return 0;
}
标签:bilibili 根据 i++ || 分析 复杂 loading rom getch
原文地址:https://www.cnblogs.com/xcxc82/p/14398264.html