DFS暴力算法挂32求助
查看原帖
DFS暴力算法挂32求助
683768
Allen_yang楼主2024/10/2 17:47

rt ,使用DFS判断是否为对称二叉树,然后暴力尝试每棵子树。三个CCF提供样例都过了,在#9后面都挂了(吸氧WA不吸氧RE)。本地试过#9,貌似是对的。

code

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
const ll MAXN = 1e6 + 10;
ll v[MAXN], l[MAXN], r[MAXN], siz[MAXN], answer;

void init(ll x){
	if(l[x] == 0 && r[x] == 0){
		siz[x] = 1;
		return;
	}
	if(l[x])init(l[x]);
	if(r[x])init(r[x]);
	siz[x] = siz[l[x]] + siz[r[x]] + 1;
}

bool cmp(ll x, ll y){
//	cout << x << " " << y << " " << v[x] << " " << v[y] << " " << siz[x] << " " << siz[y] << "\n";
	if(x == 0 && y == 0)return true;
	if(x == 0 && y == 1)return false;
	if(y == 0 && x == 1)return false;
	if(siz[x] != siz[y] || v[x] != v[y])return false;
	if(siz[x] == 1)return true;
	if(cmp(l[x], r[y]) && cmp(r[x], l[y])){
		return true;
	}
}

void solve(ll x){
//	cout << x << "##\n";
	if(l[x] == 0 && r[x] == 0){
		answer = max(answer, (ll)1);
		return;
	}
	if(l[x] && r[x] && cmp(l[x], r[x])){
		answer = max(answer, siz[x]);
	}
	if(l[x])solve(l[x]);
	if(r[x])solve(r[x]);
}

int main(){
//	freopen("tree3.in", "r", stdin);
//	freopen("tree3.out", "w", stdout);
	ll n;
	cin >> n;
	for(ll i = 1; i <= n; i ++)cin >> v[i];
	for(ll i = 1; i <= n; i ++){
		cin >> l[i] >> r[i];
		if(l[i] == -1)l[i] = 0;
		if(r[i] == -1)r[i] = 0;
	}
	init(1);
//	cout << cmp(l[1], r[1]);
	solve(1);
	cout << answer;
	return 0;
}
2024/10/2 17:47
加载中...