码迷,mamicode.com
首页 > 其他好文 > 详细

P6835 [Cnoi2020]线形生物

时间:2021-02-16 11:41:44      阅读:0      评论:0      收藏:0      [点我收藏+]

标签: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→x+1} = \dfrac{1}{k_x+1}×1+\dfrac{1}{k_x+1}×\sum\limits_{(x,y)∈E}E_{y→x+1}+1$
$= 1+\dfrac{1}{k_x+1}×\sum\limits_{(x,y)∈E}E_{y→x+1}$

根据期望的线性性质,有\(E_{x→y} =\sum\limits_{i=x}^{y-1}E_{i→i+1}\),代回原式:

$E_{x→x+1} = 1+\dfrac{1}{k_x+1}×\sum\limits_{(x,y)∈E}\sum\limits_{i=y}^{x-1}E_{i→i+1}+\dfrac{k_x×E_{x→x+1}}{k_x+1}$
$E_{x→x+1} = 1+k_x+\sum\limits_{(x,y)∈E}\sum\limits_{i=y}^{x-1}E_{i→i+1}$

维护一下前缀和即可,\(\sum\limits_{i=x}^{y-1}E_{i→i+1}\)既为所求答案

时间复杂度\(O(n+m)\)

\(code\)

//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;
}








P6835 [Cnoi2020]线形生物

标签:bilibili   根据   i++   ||   分析   复杂   loading   rom   getch   

原文地址:https://www.cnblogs.com/xcxc82/p/14398264.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!