1 solutions
-
0
10pts
#include <bits/stdc++.h> using namespace std; const long long MOD = 998244353; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; vector<long long> a(n + 1); for (int i = 1; i <= n; i++) cin >> a[i]; int m; cin >> m; vector<int> type(m + 1), p(m + 1); vector<long long> v(m + 1); for (int i = 1; i <= m; i++) { cin >> type[i]; if (type[i] == 1) { cin >> p[i] >> v[i]; } else if (type[i] == 2) { cin >> v[i]; } else { // 类型3不会出现,但为了读入格式,需要读c int c; cin >> c; // 没有子函数,直接跳过 } } int Q; cin >> Q; vector<int> seq(Q); for (int i = 0; i < Q; i++) cin >> seq[i]; // 因为是树,∑C_j = 0,没有函数调用 // 直接从后往前处理执行序列 vector<long long> add(n + 1, 0); long long mul = 1; for (int i = Q - 1; i >= 0; i--) { int f = seq[i]; if (type[f] == 1) { // 单点加,乘上当前的乘法因子 add[p[f]] = (add[p[f]] + v[f] % MOD * mul) % MOD; } else if (type[f] == 2) { // 全局乘,更新乘法因子 mul = mul * (v[f] % MOD) % MOD; } // type 3不会出现 } // 输出结果 for (int i = 1; i <= n; i++) { cout << (a[i] * mul + add[i]) % MOD << (i == n ? '\n' : ' '); } return 0; }70pts
#include <bits/stdc++.h> using namespace std; const long long MOD = 998244353; struct Func { int type, p; long long v; vector<int> child; }; int n, m, Q; long long a[1000005], add[1000005], mul[1000005]; Func f[1000005]; // 计算乘法贡献 void dfs1(int u) { if (f[u].type == 1) mul[u] = 1; else if (f[u].type == 2) mul[u] = f[u].v % MOD; else { mul[u] = 1; for (int c : f[u].child) { dfs1(c); mul[u] = mul[u] * mul[c] % MOD; } } } // 处理加法 void dfs2(int u, long long now) { if (f[u].type == 1) { add[f[u].p] = (add[f[u].p] + f[u].v % MOD * now) % MOD; } else if (f[u].type == 3) { for (int i = f[u].child.size() - 1; i >= 0; i--) { int c = f[u].child[i]; dfs2(c, now); now = now * mul[c] % MOD; } } } int main() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; cin >> m; for (int i = 1; i <= m; i++) { cin >> f[i].type; if (f[i].type == 1) cin >> f[i].p >> f[i].v; else if (f[i].type == 2) cin >> f[i].v; else { int c; cin >> c; f[i].child.resize(c); for (int j = 0; j < c; j++) cin >> f[i].child[j]; } } cin >> Q; vector<int> seq(Q); for (int i = 0; i < Q; i++) cin >> seq[i]; // 算所有函数的乘法 for (int i = 1; i <= m; i++) dfs1(i); // 从后往前执行 long long now = 1; for (int i = Q - 1; i >= 0; i--) { dfs2(seq[i], now); now = now * mul[seq[i]] % MOD; } for (int i = 1; i <= n; i++) { cout << (a[i] * now + add[i]) % MOD << (i == n ? '\n' : ' '); } }
- 1
Information
- ID
- 1144
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 10
- Tags
- # Submissions
- 10
- Accepted
- 1
- Uploaded By