教练把这题当模拟赛,场上打了 90pts/youl
求助/kel
#include<cstdio>
const int M=1e5+5;
int n,mx[M],lmx[M],chi[M][2];
int DFS(int u,int d){
if(!~u)return 0;
int l=chi[u][0],r=chi[u][1],tl=DFS(l,d+1),tr=DFS(r,d+1);
if(!~chi[u][0]&&!~chi[u][1]){
mx[u]=d+1;lmx[u]=0;
return 0;
}
if(!~tl||!~tr)return-1;
if(!~l&&r){
if(lmx[r]){
if(d+1!=mx[r]&&d+1!=lmx[r])return-1;
mx[u]=mx[r];lmx[u]=lmx[r];
if(d+1==lmx[r]){
return tr+1;
}
else{
return tr;
}
}
else{
if(d+1<mx[r]){
mx[u]=mx[r];lmx[u]=d+1;
return tr+1;
}
else{
mx[u]=d+1;lmx[u]=mx[r];
return tr;
}
}
}
if(l&&!~r){
if(lmx[l]){
if(d+1!=mx[l]&&d+1!=lmx[l])return-1;
mx[u]=mx[l];lmx[u]=lmx[l];
if(d+1==lmx[l]){
return tl;
}
else{
return tl+1;
}
}
else{
if(d+1<mx[l]){
mx[u]=mx[l];lmx[u]=d+1;
return tl;
}
else{
mx[u]=d+1;lmx[u]=mx[l];
return tl+1;
}
}
}
else{
if(mx[l]&&lmx[l]&&mx[r]&&lmx[r])return-1;
if(lmx[l]){
mx[u]=mx[l];lmx[u]=lmx[l];
if(mx[r]!=lmx[l]&&mx[r]!=mx[l])return-1;
if(mx[l]==mx[r]){
return tl+tr+1;
}
else{
return tl+tr;
}
}
if(lmx[r]){
mx[u]=mx[r];lmx[u]=lmx[r];
if(mx[l]!=lmx[r]&&mx[l]!=mx[r])return-1;
if(mx[l]==mx[r]){
return tl+tr;
}
else{
return tl+tr+1;
}
}
else{
if(mx[l]<mx[r]){
mx[u]=mx[r];
lmx[u]=mx[l];
return tl+tr+1;
}
if(mx[l]>mx[r]){
mx[u]=mx[l];
lmx[u]=mx[r];
return tl+tr;
}
else{
mx[u]=mx[l];
return tl+tr;
}
}
}
}
signed main(){
scanf("%d",&n);
for(register int i=1;i<=n;++i)scanf("%d%d",chi[i]+0,chi[i]+1);
printf("%d",DFS(1,1));
}