64分求调
查看原帖
64分求调
1436220
tinalu楼主2025/1/13 17:21
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = (int)1e6 + 1;
int n, ans[N], len, p[N], s[N];

struct TreeNode {
	int v;
	int l, r;
} a[N];

int calc(int i) {
	if (a[i].l < 0 && a[i].r < 0)
		s[i] = 1;
	else if (a[i].l < 0)
		s[i] = calc(a[i].r) + 1;
	else if (a[i].r < 0)
		s[i] = calc(a[i].l) + 1;
	else
		s[i] = calc(a[i].l) + calc(a[i].r) + 1;
	return s[i];
}

inline void dfs(int i) {
	if (a[i].l > 0)
		dfs(a[i].l);
	else
		ans[++len] = a[i].l;
	ans[++len] = a[i].v;
	p[i] = len;
	if (a[i].r > 0)
		dfs(a[i].r);
	else
		ans[++len] = a[i].r;
}

int dfs2(int l, int i, int r) {
	int ll = 0;
	int L = l, R = r;
	while (ans[L + 1] == ans[R - 1] && L != R)
		L++, R--;
	if (L == R && L == p[i])
		return s[i];
	if (a[i].l > 0 && a[i].r > 0)
		ll = max(dfs2(l, a[i].l, p[i] - 1), dfs2(p[i] + 1, a[i].r, r));
	else if (a[i].l > 0)
		ll = dfs2(l, a[i].l, p[i] - 1);
	else if (a[i].r > 0)
		ll = dfs2(p[i] + 1, a[i].r, r);
	else
		ll = 1;
	return ll;
}

int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i].v);
	for (int i = 1; i <= n; i++)
		scanf("%d%d", &a[i].l, &a[i].r);
	calc(1);
	dfs(1);
	printf("%d\n", dfs2(1, 1, len));
	return 0;
}
2025/1/13 17:21
加载中...