2026.5.4情报系统听课笔记

image

今日题单:https://www.luogu.com.cn/training/1007669

贝叶斯公式:

\[\begin{align*} P(AB) =& P(A)P(B|A)\\ \therefore P(B)P(A|B) =& P(A)P(B|A) \\ \therefore P(A|B) =& \dfrac{P(A)P(B|A)}{P(B)} \end{align*} \]

\(A,B\) 同时发生的概率等于 \(A\) 发生的概率乘以在 \(A\) 发生的条件下 \(B\) 发生的概率。
期望的线性性:

\[E(A + B) = E(A) + E(B) \]

\(A,B\) 独立(互不影响)时:

\[E(AB) = E(A)E(B) \]

线性性的例子:
image

\(X_i\) 相互独立,且 \(\sum X_i = X\)\(E(X_1) = E(X_2) = \cdots\)

\[\begin{align*} E(X^2)& = E((\sum X_i)^2) = E(\sum_{i,j}(X_iX_j))\\&= E(\sum_{i}X_i^2 + \sum_{i\not= j}(X_iX_j))\\ &=E(\sum_iX_i^2) + E(\sum_{i\not= j}(X_iX_j)) \\ &=nE(X_1^2) + n(n - 1)(E(X_1))^2 \end{align*} \]

image
image
image
image
image
image
image
image
image

点击查看代码
#include <iostream>
#include <queue>
#include <cstdio>
#include <vector>
#include <algorithm>
#define pii std::pair<int, int>

using std::cin;
using std::cout;
const int N = 1e5 + 10;

double f[N];
int deg[N];
int ddeg[N];
std::queue<int> q;
std::vector<pii> e[N];

int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= m; ++i)
	{
		int u, v, w;
		cin >> u >> v >> w;
		e[v].push_back({u, w});
		deg[u]++;
		ddeg[u]++;
	}
	for (int i = 1; i <= n; ++i)
	{
		if (!deg[i])
			q.push(i);
	}
	while (q.size())
	{
		int x = q.front();
		q.pop();
		for (auto nxt : e[x])
		{
			int to = nxt.first;
			int val = nxt.second;
			deg[to]--;
			f[to] += (f[x] + val) / ddeg[to];
			if (!deg[to])
				q.push(to);
		}
	}
	printf("%.2lf\n", f[1]);
	return 0;
}

image
注意到

\[n^2 = \sum^n_{i = 1}(2(i - 1) + 1) \]

因此我们可以转化一下:
image

点击查看代码
#include <iostream>
#include <cstdio>

using std::cin;
using std::cout;
const int N = 3e5 + 10;

double f[N];
double len[N];

int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; ++i)
	{
		char c;
		cin >> c;
		double p;
		if (c == 'o')
			p = 1;
		else if (c == 'x')
			p = 0;
		else
			p = 1.0 / 2;
		len[i] = p * (len[i - 1] + 1);
		f[i] = f[i - 1] + p * (2.0 * len[i - 1] + 1);
	}
	printf("%.4lf", f[n]);
	return 0;
}

进阶版:
image

点击查看代码
#include <iostream>
#include <cstdio>

using std::cin;
using std::cout;
const int N = 3e5 + 10;

double ans[N];
double x2[N];
double x[N];

int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; ++i)
	{
		double p;
		cin >> p;
		x[i] = x[i - 1] + 1;
		x2[i] = x2[i - 1] + 2.0 * x[i] - 1;
		ans[i] = ans[i - 1] + p * (3.0 * x2[i] - 3.0 * x[i] + 1);
		x[i] *= p;
		x2[i] *= p;
	}
	printf("%.1lf", ans[n]);
	return 0;
}

数轴上随机游走(一维随机游走):
已知有无穷个位置:\(\cdots,-2,-1,0,1,2,\cdots\),每一步有 \(p > 50\%\) 的概率向右走,\(1-p\) 的概率向左走,求从 \(0\) 走到 \(n\) 走的步数的期望。
首先设 \(f\) 为第一次走到 \(1\) 的期望步数,则走到 \(n\) 的期望步数为 \(nf\),因为需要从 \(0\to 1,1\to 2,\cdots 2\to n\)
又因为 \(f = p\cdot 1 + (1 - p)\cdot 2f\)(从 \(0\) 走有 \(p\) 的概率到 \(1\),又有 \(1-p\) 的概率走到 \(-1\),此时又需要走两次才能到 \(1\))。
所以 \(f = \dfrac{1}{2p - 1}\)

posted @ 2026-05-04 16:34  SigmaToT  阅读(7)  评论(0)    收藏  举报