玄关,68pts求调
查看原帖
玄关,68pts求调
891062
Ericzc楼主2024/10/20 16:11

题目传送门

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

int n;
int child[1000010][2];
int v[1000010];
int sum[1000010];
bool vis[1000010];
LL ans = 1;

void init_sum(int x)
{
	sum[x] += 1;
	if(child[x][0] > 0)
	{
		init_sum(child[x][0]);
		sum[x] += sum[child[x][0]];
	}
	if(child[x][1] > 0)
	{
		init_sum(child[x][1]);
		sum[x] += sum[child[x][1]];
	}
	return;
}

bool dfs(int u,int w)
{
	if(!u && !w) return true;
	if(sum[u] != sum[w])
	{
		return false;
	}
	if(v[u] != v[w])
	{
		return false;
	}
	if(!(child[u][1] ^ child[w][0]) || !(child[u][0] ^ child[w][1]))
	{
		return (dfs(child[u][0],child[w][1]) & dfs(child[u][1],child[w][0]));
	}
	return false;
}

int main() {
	ios::sync_with_stdio(0);
//	freopen("prison.in","r",stdin);
//	freopen("prison.out","w",stdout);
	cin >> n;
	for(int i = 1;i <= n;i ++)
	{
		cin >> v[i];
	}
	for(int i = 1;i <= n;i ++)
	{
		cin >> child[i][0] >> child[i][1];
		if(child[i][0] == -1) child[i][0] = 0;
		if(child[i][1] == -1) child[i][1] = 0;
	}
	init_sum(1);
	for(int i = 1;i <= n;i ++)
	{
		if(child[i][0] && child[i][1] && sum[child[i][0]] == sum[child[i][1]] && ans < sum[i])
		{
			if(dfs(child[i][0],child[i][1]))
			{
				ans = sum[i];
			}
		}
	}
	cout << ans;
	return 0;
}
2024/10/20 16:11
加载中...