知乎 ”大家都见过哪些让你虎躯一震的代码?“用户“李晨昊”回答的等价代码

下图是这个回答中的代码 

 原代码:

int merge(int x,int y)
{
    return (!x||!y)
                    ?( (x)?(x):(y) )
                    :( (rand()%(tr[x].siz+tr[y].siz)<tr[x].siz)
                                ?( tr[++tot]=tr[x], x=tot, tr[x].ch[1]=merge(tr[x].ch[1],y), update(x), x)
                                :( tr[++tot]=tr[y], y=tot, tr[y].ch[0]=merge(x,tr[y].ch[0]), update(y), y) 
                     );
}

等价代码:

 int merge(int x,int y)
{
    if(x==0||y==0)
    {
        if(x!=0) return x;
        else return y;
    }
    else
    {
        if( rand()%(tr[x].siz+tr[y].siz)  <  tr[x].siz )
        {
            tr[++tot]=tr[x];
            x=tot;
            tr[x].ch[1]=merge( tr[x].ch[1] , y );
            update(x);
            return x;
        }
        else
        {
            tr[++tot]=tr[y];
            y=tot;
            tr[y].ch[0]=merge( x , tr[y].ch[0] );
            update(y);
            return y;
        }
    }
}

 

 原代码:

void split(int x,int e)
{
    (!x)
        ?(l=r=0)
        :(tr[++tot]=tr[x],x=tot,( (tr[tr[x].ch[0]].siz>=e)
                                                                ?(split(tr[x].ch[0] , e), tr[x].ch[0]=r, r=x)
                                                                :(split(tr[x].ch[1] , e-tr[tr[x].ch[0]].siz-1), tr[x].ch[1]=l , l=x)
                                            ),update(x)
         );
}

 

 等价代码:

void split(int x,int e)
{
    if(x==0)
    {
        l=r=0;
    }
    else
    {
        tr[++tot]=tr[x];
        x=tot;
        
        if( tr[tr[x].ch[0]].siz  >=  e)
        {
            split( tr[x].ch[0]   ,  e );
            tr[x].ch[0]=r;
            r=x;
        }
        else
        {
            split( tr[x].ch[1]   ,   e-tr[tr[x].ch[0]].siz-1 );
            tr[x].ch[1]=l;
            l=x;
        }
        
        update(x);
    }
}

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

AN_drew

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值