传送门
脑残模拟题。
如果叶节点深度之差>1无解。
暴力判断两种深度的节点是否存在。
如果左右子树都有不合法。
暴力判断是否要交换即可。
#include<cstdio>
#include<cmath>
#include<ctime>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int c[4][4]={{0,0,0,0},{0,0,0,0},{0,1,0,1},{0,1,0,0}};
int a[100005],b[100005],n,mi,ma,ans;
int read(){
int k=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9'){
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9'){
k=k*10+ch-'0';
ch=getchar();
}
return k*f;
}
void dfs(int x,int dep){
if (x==-1){
ma=max(ma,dep);
mi=min(mi,dep);
return;
}
dfs(a[x],dep+1);
dfs(b[x],dep+1);
}
int dp(int x,int dep){
if (x==-1) return dep==mi?2:1;
int l=dp(a[x],dep+1);
int r=dp(b[x],dep+1);
if (l+r==6){
printf("-1");
exit(0);
}
ans+=c[l][r];
return l|r;
}
int main(){
n=read();
for (int i=1;i<=n;i++){
a[i]=read();
b[i]=read();
}
mi=10000000;
ma=0;
dfs(1,0);
if (ma>mi+1){
printf("-1");
return 0;
}
if (ma==mi){
printf("0");
return 0;
}
dp(1,0);
printf("%d",ans);
return 0;
}