就离谱
  • 板块灌水区
  • 楼主Stinger
  • 当前回复9
  • 已保存回复9
  • 发布时间2021/2/13 13:59
  • 上次更新2023/11/5 03:19:42
查看原帖
就离谱
361308
Stinger楼主2021/2/13 13:59

灵异事件

2424 行处,明明是 i0i\neq 0 才会进入这个if,但它竟然给我输出 i=0i=0,就尼玛离谱。

求助qwq

#include <cstdio>
#include <cassert>
#define int long long

const int MOD = 998244353LL;
int a[100005];
struct Edge {
	int to, nxt;
} e[500005];
int head[100005], c[100005], T[100005], P[100005], V[100005], g[100005], f[100005], tot, n;
bool vis[100005];
inline void AddEdge(const int u, const int v) {
	e[++ tot].to = v, e[tot].nxt = head[u], head[u] = tot;
}
inline int dfs(const int u, const int mul) {
	printf("%d\n", u);
	vis[u] = true;
	f[u] = (f[u] + mul) % MOD;
	if (T[u] != 3) return T[u] == 1 ? 1 : V[u];
	int sum(f[u]);
	f[u] = 0;
	for (int i(head[u]); i; i = e[i].nxt) {
		if (i && e[i].to == 0) {
			printf("\n\n\n\nbjfjrnjbnejlvbnsfjbn %lld %lld\n\n\n\n", i, e[i].to);
		    assert(!i);
		}
		sum = sum * dfs(e[i].to, sum) % MOD;
	}
}

signed main() {
	int m, q;
	scanf("%lld", &n);
	for (int i(1); i <= n; ++ i) scanf("%lld", a + i), a[i] %= MOD;
	scanf("%lld", &m);
	for (int i(1); i <= m; ++ i) {
		scanf("%lld", T + i);
		if (T[i] == 1) scanf("%lld%lld", P + i, V + i);
		else if (T[i] == 2) scanf("%lld", V + i);
		else {
			int c;
			scanf("%lld", &c);
			for (int j(1); j <= c; ++ j) scanf("%lld", g + j);
			for (int j(c); j; -- j) AddEdge(i, g[j]);
		}
	}
	scanf("%lld", &q);
	while (q --) {
		int Orz;
		scanf("%lld", &Orz);
		f[Orz] = 1;
	}
	for (int i(1); i <= m; ++ i)
		if (f[i] && !vis[i]) dfs(i, 0);
	int mult(1LL);
	for (int i(1); i <= m; ++ i)
		if (T[i] == 2) mult *= V[i], mult %= MOD;
	for (int i(1); i <= n; ++ i) a[i] = a[i] * mult % MOD;
	for (int i(1); i <= m; ++ i)
		if (T[i] == 1) a[P[i]] = (a[P[i]] + f[i] * V[i] % MOD) % MOD;
	for (int i(1); i <= n; ++ i) printf("%d ", a[i]);
	return 0;
}
2021/2/13 13:59
加载中...