bzoj1149: [CTSC2007]风玲Mobiles

来源:互联网 发布:淘宝男鞋高仿店推荐 编辑:程序博客网 时间:2024/04/29 18:00

传送门
脑残模拟题。
如果叶节点深度之差>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;}
0 0
原创粉丝点击