90pts求助
查看原帖
90pts求助
160839
Prean楼主2020/12/2 22:00

教练把这题当模拟赛,场上打了 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));
}
2020/12/2 22:00
加载中...