树上高斯消元
太菜了,搞了一下午才搞懂。。
题意:
一棵有
个节点的树,每个点都有一个权值 。从 号点开始,每次等概率随机移动到一个相邻节点 ,并获得 的得分。(可以重复获得,起点权值也计算)到达叶节点时停止移动。 有
次修改,每次修改一个点的权值。在一开始和每次修改后,求出移动到叶节点的期望得分,对 取模。保证 号点不是叶子。
先 DP,设
看起来只能高斯消元,但我们可以指定
只需要考虑
考虑设主元,将
设
即
观察上式,考虑每个点对答案的贡献,即
由于
代码:
#include<bits/stdc++.h>
#define endl '\n'
#define rep(i, s, e) for(int i = s, i##E = e; i <= i##E; ++i)
#define per(i, s, e) for(int i = s, i##E = e; i >= i##E; --i)
#define F first
#define S second
#define int ll
#define gmin(x, y) ((x > (y)) && (x = (y)))
#define gmax(x, y) ((x < (y)) && (x = (y)))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double f128;
typedef pair<int, int> pii;
constexpr int N = 1e5 + 5, mod = 998244353;
int n, a[N], k[N], s[N], t[N];
vector<int> to[N];
int qp(int a, int b) {
int res = 1;
for(; b; b >>= 1) {
if(b & 1) res = res * a % mod;
a = a * a % mod;
}
return res;
}
void dfs1(int u, int f) {
if(to[u].size() == 1) return;
int K = 0;
for(auto v : to[u]) if(v != f) {
dfs1(v, u);
K = (K + k[v]) % mod;
}
int d = to[u].size();
k[u] = qp((d - K + mod) % mod, mod - 2);
}
void dfs2(int u, int f) {
if(to[u].size() == 1) s[u] = s[f];
else s[u] = s[f] * k[u] % mod;
t[u] = s[u] * to[u].size() % mod;
for(auto v : to[u]) if(v != f) dfs2(v, u);
}
signed main() {
#ifdef ONLINE_JUDGE
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
#endif
cin >> n;
rep(i, 1, n) cin >> a[i];
rep(i, 1, n - 1) {
int u, v; cin >> u >> v;
to[u].push_back(v);
to[v].push_back(u);
}
dfs1(1, 0);
s[0] = 1;
dfs2(1, 0);
int ans = 0;
rep(i, 1, n) ans = (ans + a[i] * t[i]) % mod;
cout << ans << endl;
int m; cin >> m;
while(m--) {
int x, y; cin >> x >> y;
ans = (ans + t[x] * (y - a[x]) % mod + mod) % mod;
cout << ans << endl;
a[x] = y;
}
return 0;
}
总结自官方题解:
DP 的本质是在状态 DAG 上跑递推,不能直接转移的原因往往是状态上有环。如果这些环没有公共边,或者说这些状态构成树的形态,可以考虑用设主元的方式,一层层破开转移环,最后计算答案。
upd. 2024.04.27 事实上这个套路有一个名字叫做树上高斯消元。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类