6 条题解
-
4
话不多说上代码(AC完别忘点赞)
#include <bits/stdc++.h> #define N 1000005 using namespace std; typedef long long ll; template <typename T> inline void read(T &num) { T x = 0; char ch = getchar(); for (; ch > '9' || ch < '0'; ch = getchar()); for (; ch <= '9' && ch >= '0'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ '0'); num = x; } const ll mod = 998244353; int n, m, Q, F[N]; int head[N], pre[N<<1], to[N<<1], sz, inde[N]; ll a[N]; inline void addedge(int u, int v) { pre[++sz] = head[u]; head[u] = sz; to[sz] = v; inde[v]++; } struct oper { int tp, p; ll v, mul, sum; } b[N]; queue<int> q; int ord[N], bnbn; void toposort() { //拓扑排序 for (int i = 1; i <= m; i++) if (!inde[i]) q.push(i); while (!q.empty()) { int x = q.front(); q.pop(); ord[++bnbn] = x; for (int i = head[x]; i; i = pre[i]) { int y = to[i]; inde[y]--; if (!inde[y]) q.push(y); } } } void getmul() { //计算节点的mul for (int i = m; i; i--) { int x = ord[i]; for (int j = head[x]; j; j = pre[j]) { int y = to[j]; b[x].mul = b[x].mul * b[y].mul % mod; } } } void getsum() { //下传节点的sum for (int i = 1; i <= m; i++) { int x = ord[i]; ll now = 1; for (int j = head[x]; j; j = pre[j]) { int y = to[j]; b[y].sum = (b[y].sum + b[x].sum * now % mod) % mod; now = now * b[y].mul % mod; } } } int main() { read(n); for (int i = 1; i <= n; i++) read(a[i]); read(m); for (int i = 1; i <= m; i++) { read(b[i].tp); if (b[i].tp == 1) { read(b[i].p); read(b[i].v); b[i].mul = 1; } else if (b[i].tp == 2) { read(b[i].v); b[i].mul = b[i].v; } else { read(b[i].p); b[i].mul = 1; for (int j = 1, x; j <= b[i].p; j++) { read(x); addedge(i, x); } } } toposort(); getmul(); read(Q); ll now = 1; for (int i = 1; i <= Q; i++) read(F[i]); for (int i = Q; i; i--) { int x = F[i]; b[x].sum = (b[x].sum + now) % mod; now = now * b[x].mul % mod; } getsum(); for (int i = 1; i <= n; i++) a[i] = a[i] * now % mod; for (int i = 1; i <= m; i++) { if (b[i].tp == 1) { a[b[i].p] = (a[b[i].p] + b[i].v * b[i].sum % mod) % mod; } } for (int i = 1; i <= n; i++) printf("%lld ", a[i]); return 0; }
-
0
写题解请注意
鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
</span>
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
-
-1
#include <bits/stdc++.h> #define N 1000005 using namespace std; typedef long long ll;
template <typename T> inline void read(T &num) { T x = 0; char ch = getchar(); for (; ch > '9' || ch < '0'; ch = getchar()); for (; ch <= '9' && ch >= '0'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ '0'); num = x; }
const ll mod = 998244353; int n, m, Q, F[N]; int head[N], pre[N<<1], to[N<<1], sz, inde[N]; ll a[N];
inline void addedge(int u, int v) { pre[++sz] = head[u]; head[u] = sz; to[sz] = v; inde[v]++; }
struct oper { int tp, p; ll v, mul, sum; } b[N];
queue<int> q; int ord[N], bnbn; void toposort() { //拓扑排序 for (int i = 1; i <= m; i++) if (!inde[i]) q.push(i); while (!q.empty()) { int x = q.front(); q.pop(); ord[++bnbn] = x; for (int i = head[x]; i; i = pre[i]) { int y = to[i]; inde[y]--; if (!inde[y]) q.push(y); } } }
void getmul() { //计算节点的mul for (int i = m; i; i--) { int x = ord[i]; for (int j = head[x]; j; j = pre[j]) { int y = to[j]; b[x].mul = b[x].mul * b[y].mul % mod; } } }
void getsum() { //下传节点的sum for (int i = 1; i <= m; i++) { int x = ord[i]; ll now = 1; for (int j = head[x]; j; j = pre[j]) { int y = to[j]; b[y].sum = (b[y].sum + b[x].sum * now % mod) % mod; now = now * b[y].mul % mod; } } }
int main() { read(n); for (int i = 1; i <= n; i++) read(a[i]); read(m); for (int i = 1; i <= m; i++) { read(b[i].tp); if (b[i].tp == 1) { read(b[i].p); read(b[i].v); b[i].mul = 1; } else if (b[i].tp == 2) { read(b[i].v); b[i].mul = b[i].v; } else { read(b[i].p); b[i].mul = 1; for (int j = 1, x; j <= b[i].p; j++) { read(x); addedge(i, x); } } } toposort(); getmul(); read(Q); ll now = 1; for (int i = 1; i <= Q; i++) read(F[i]); for (int i = Q; i; i--) { int x = F[i]; b[x].sum = (b[x].sum + now) % mod; now = now * b[x].mul % mod; } getsum(); for (int i = 1; i <= n; i++) a[i] = a[i] * now % mod; for (int i = 1; i <= m; i++) { if (b[i].tp == 1) { a[b[i].p] = (a[b[i].p] + b[i].v * b[i].sum % mod) % mod; } } for (int i = 1; i <= n; i++) printf("%lld ", a[i]); return 0; }
-
-1
写题解请注意
鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
</span>
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
-
-3
写题解请注意
鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
</span>
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
- 1
信息
- ID
- 1363
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 46
- 已通过
- 24
- 上传者