社区讨论
普及月赛 D 有人用换根的吗?
学术版参与者 13已保存回复 24
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 24 条
- 当前快照
- 1 份
- 快照标识符
- @lo1ocbih
- 此快照首次捕获于
- 2023/10/23 00:19 2 年前
- 此快照最后确认于
- 2023/11/03 01:00 2 年前
有的话帮我调一下:
CPP#include <bits/stdc++.h>
using namespace std;
#define int long long
#define MAXN 200001
const int MOD(998244353);
int n, q, u, v, w, ans;
int siz[MAXN], f[MAXN];
struct Edge{
int v, w;
};
vector<Edge> e[MAXN];
int dfs(int x, int fa){
siz[x] = 1;
int res(0);
for (auto i: e[x]){
int v(i.v);
if (v != fa){
res = (res + dfs(v, x) + (siz[v] * i.w) % MOD) % MOD;
siz[x] += siz[v];
}
}
return res;
}
void dfs2(int x, int fa){
for (auto i: e[x]){
int v(i.v);
if (v != fa){
f[v] = f[x] + (n-(siz[v]<<1)) * i.w;
if (f[v] < 0){
f[v] += (llabs(f[v]) / MOD + 1) * MOD;
f[v] %= MOD;
}
siz[x] = n-siz[v];
siz[v] = n;
dfs2(v, x);
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> q;
for (int i(1); i<n; ++i){
cin >> u >> v >> w;
e[u].push_back({v, w});
e[v].push_back({u, w});
}
f[1] = dfs(1, 0);
dfs2(1, 0);
for (int i(1); i<=n; ++i) ans = (ans + f[i]) % MOD;
while (q--){
cin >> u >> w;
cout << (ans + (w*n + f[u]) * 2) % MOD << '\n';
}
return 0;
}
回复
共 24 条回复,欢迎继续交流。
正在加载回复...