求条
查看原帖
求条
1286053
Nostopathy楼主2025/7/21 17:50
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define pb push_back
#define rep(a, b, c, d) for(int a=b; a<=c; a+=d)
#define mod 998244353
const int N = 1e5 + 5;
int n, m, q, a[N], t[N], add[N], mul[N], pos[N], deg[N], deg2[N], sum[N];
vector<int> G1[N], G2[N];
void cal_mul() {
	queue<int> q;
	rep(i, 0, m, 1) {
		deg[i] = G2[i].size();
		if(!deg[i])
			q.push(i);
	}
	while(!q.empty()) {
		int u = q.front();
		q.pop();
		for(int v: G1[u]) {
			mul[v] = mul[v] * mul[u] % mod;
			-- deg[v];
			if(!deg[v])
				q.push(v);
		}
	}
}
void cal_num() {
	queue<int> q;
	rep(i, 0, m, 1) {
		deg2[i] = G1[i].size();
		if(!deg2[i])
			q.push(i);
	}
	while(!q.empty()) {
		int u = q.front();
		q.pop();
		int nowmul = 1;
		rep(j, G2[u].size() - 1, 0, -1) {
			int v = G2[u][j];
			sum[v] = (sum[v] + sum[u] * nowmul) % mod;
			nowmul = nowmul * mul[v] % mod;
			-- deg2[v];
			if(!deg2[v])
				q.push(v);
		}
	}
}
signed main () {
	scanf("%lld", &n);
	rep(i, 1, n, 1)
		scanf("%lld", &a[i]);
	scanf("%lld", &m);
	mul[0] = 1;
	rep(i, 1, m, 1) {
		scanf("%lld", &t[i]);
		if(t[i] == 1)
			scanf("%lld%lld", &pos[i], &add[i]), mul[i] = 1;
		if(t[i] == 2)
			scanf("%lld", &mul[i]);
		if(t[i] == 3) {
			int c;
			scanf("%lld", &c);
			mul[i] = 1;
			rep(j, 1, c, 1) {
				int g;
				scanf("%lld", &g);
				G1[g].pb(i);
				G2[i].pb(g);
			}
		}
	}
	scanf("%lld", &q);
	rep(i, 1, q, 1) {
		int f;
		scanf("%lld", &f);
		G1[f].pb(0);
		G2[0].pb(f);
	}
	sum[0] = 1;
	cal_mul();
	cal_num();
	rep(i, 1, n, 1)
		a[i] = a[i] * mul[0] % mod;
	rep(i, 1, m, 1)
	printf("%lld ", add[i]);
	rep(i, 1, m, 1)
		if(t[i] == 1)
			a[pos[i]] = (a[pos[i]] + sum[i] * add[i]) % mod;
	rep(i, 1, n, 1)
		printf("%lld ", a[i]);
	return 0;
}
2025/7/21 17:50
加载中...