求助,WA on #4
查看原帖
求助,WA on #4
174009
denominator楼主2023/6/28 22:36
#include <bits/stdc++.h>
using namespace std;
#define printif(cond) if (cond) { \
	puts ("YES"); \
} else { \
	puts ("NO"); \
}
#define debug(...) fprintf (stderr, __VA_ARGS__)
#define output(ans) debug ("%d %d %d %d %d %d %d\n", ans.sum, ans.pmx, ans.pmn, ans.smx, ans.smn, ans.tmx, ans.tmn)
const int N = 200010, LOGN = 30, LOGn = 18;
int T, n, m, q, a[N], _u[N], _v[N], _k[N], fa[N][LOGN], dep[N];
struct _data {
	int sum, pmx, pmn, smx, smn, tmx, tmn;
} dp[N][LOGN];
_data merge (_data a, _data b) {
	_data ans;
	ans.sum = a.sum + b.sum;
	ans.pmx = max (a.pmx, a.sum + b.pmx);
	ans.pmn = min (a.pmn, a.sum + b.pmn);
	ans.smx = max (b.smx, b.sum + a.smx);
	ans.smn = min (b.smn, b.sum + a.smn);
	ans.tmx = max (a.smx + b.pmx, max (a.tmx, b.tmx));
	ans.tmn = min (a.smn + b.pmn, min (a.tmn, b.tmn));
	return ans;
}
int main () {
	scanf ("%d", &T);
	while (T --> 0) {
		scanf ("%d", &m);
		n = 1;
		q = 0;
		dp[1][0].sum = dp[1][0].pmx = dp[1][0].smx = dp[1][0].tmx = 1;
		for (int i = 1; i <= m; i++) {
			char op[5];
			scanf ("%s", op);
			if (op[0] == '+') {
				n++;
				scanf ("%d%d", &fa[n][0], &a[n]);
				dp[n][0].sum = a[n];
				if (a[n] == 1) {
					dp[n][0].pmx = dp[n][0].smx = dp[n][0].tmx = 1;
					dp[n][0].pmn = dp[n][0].smn = dp[n][0].tmn = 0;
				} else {
					dp[n][0].pmn = dp[n][0].smn = dp[n][0].tmn = -1;
					dp[n][0].pmx = dp[n][0].smx = dp[n][0].tmx = 0;
				}
				dep[n] = dep[fa[n][0]] + 1;
			} else {
				q++;
				scanf ("%d%d%d", &_u[q], &_v[q], &_k[q]);
			}
		}
		for (int j = 1; j <= LOGn; j++) {
			for (int i = 1; i <= n; i++) {
				fa[i][j] = fa[fa[i][j - 1]][j - 1];
				dp[i][j] = merge (dp[i][j - 1], dp[fa[i][j - 1]][j - 1]);
			}
		}
		for (int i = 1; i <= q; i++) {
			int u = _u[i], v = _v[i];
			if (dep[u] < dep[v]) {
				swap (u, v);
			}
			_data l = {0, 0, 0, 0, 0, 0, 0}, r = {0, 0, 0, 0, 0, 0, 0}, ans;
			for (int j = LOGn; j >= 0; j--) {
				if (fa[u][j] != 0 && dep[fa[u][j]] >= dep[v]) {
					l = merge (l, dp[u][j]);
					u = fa[u][j];
				}
			}
			if (u == v) {
				ans = merge (l, dp[u][0]);
			} else {
				for (int j = LOGn; j >= 0; j--) {
					if (fa[u][j] != 0 && fa[v][j] != 0 && fa[u][j] != fa[v][j]) {
						l = merge (l, dp[u][j]);
						r = merge (dp[v][j], r);
						u = fa[u][j];
						v = fa[v][j];
					}
				}
				// output (l);
				// output (dp[u][1]);
				// output (dp[v][0]);
				// output (merge (l, dp[u][1]));
				// output (merge (merge (l, dp[u][1]), dp[v][0]));
				ans = merge (merge (merge (l, dp[u][1]), dp[v][0]), r);
			}
			// output (ans);
			printif (_k[i] >= 0 && _k[i] <= ans.tmx || _k[i] < 0 && _k[i] >= ans.tmn);
		}
	}
	return 0;
}

wrong answer expected YES, found NO [13111th token]

因为 #1#2#3#4 都错过所以疯了,求助!

2023/6/28 22:36
加载中...