48分求助
查看原帖
48分求助
192631
学而思李老师楼主2020/8/20 13:00

RT,只能通过 n10n\leq10 、完全二叉树和点权均为1的情况,是不是少考虑了些什么?

评测记录

代码:

#include <cstdio>
#include <algorithm>
using namespace std;

typedef long long ll;
const int NR = 1e6 + 5;
ll a[NR], son[NR][2], size[NR];
ll n;
ll ans = 0;

void dfs(ll k)					//找出每一个节点的子节点个数 
{
	size[k] = 1;
	if(son[k][0] != -1)
	{
		dfs(son[k][0]);
		size[k] += size[son[k][0]];
	}
	if(son[k][1] != -1)
	{
		dfs(son[k][1]);
		size[k] += size[son[k][1]];
	}
}

bool chk(ll p, ll q)				//判断根节点为p和q的两个子树是否对称 
{
	if(p == q && q == -1)
		return true;
	if(p != -1 && q != -1 && chk(son[p][0], son[q][1]) && chk(son[p][1], son[q][0]))
		return true;
	return false;
}

int main()
{
	scanf("%lld", &n);
	for(int i = 1; i <= n; i ++)
		scanf("%lld", a + i);
	for(int i = 1; i <= n; i ++)
		scanf("%lld%lld", &son[i][0], &son[i][1]);
	
	dfs(1);
	for(int i = 1; i <= n; i ++)
		if(chk(son[i][0], son[i][1]))
			ans = max(ans, size[i]);
	printf("%lld", ans);
	return 0;
}
2020/8/20 13:00
加载中...