社区讨论

80pts求调

P5018[NOIP 2018 普及组] 对称二叉树参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjruuln
此快照首次捕获于
2025/11/04 07:29
4 个月前
此快照最后确认于
2025/11/04 07:29
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>

using namespace std;

#define int long long

int read(){
	char c=getchar();
	bool b=0;
	while(c<'0'||c>'9'){
		if(c=='-'){
			b=1;
		}
		c=getchar();
	}	
	int res=0;
	while(c>='0'&&c<='9'){
		res=res*10+(c-'0');
		c=getchar();
	}
	if(b){
		return -res;
	}
	return res;
}

void put(int num){
	while(num!=0){
		putchar((num%10)+'0');
		num/=10;
	}
	return;
}

const int N=1e6+30;

struct Tree{
	int data;
	int l,r;
}tree[N];

bool check(int l,int r){
	if(l==-1&&r==-1){
		return 1;
	}
	if(l==-1||r==-1){
		return 0;
	}
	if(tree[l].data!=tree[r].data){
		return 0;
	}
	return check(tree[l].l,tree[r].r)&&check(tree[l].r,tree[r].l);
}

int subtree(int o){
	if(o==-1){
		return 0;
	}
	return subtree(tree[o].l)+subtree(tree[o].r)+1;
}

signed main(){
	int n=read();
	for(int i=1;i<=n;i++){
		cin>>tree[i].data;
	}
	for(int i=1;i<=n;i++){
		int L=read(),R=read();
		tree[i].l=L;
		tree[i].r=R;
	}
	int ans=1;
	for(int i=1;i<=n;i++){
		if(check(tree[i].l,tree[i].r)){
			ans=max(ans,subtree(i));
		}
	}
	put(ans);
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...