近几天的悲剧合集

首先,前天晚上鼓起勇气写fhq的K凹凸序列,写来写去,它竟然给我超时。好伤心的。后来,猛然间,发现我的左偏树的combine是这么写的:

int combine (int i, int j)
{
  if (key[j] > key[i])
    swap (&i, &j);
  if (!j) return i;
  rc[i] = combine (rc[i], j);
  if (dist[rc[i]] > dist[lc[j]])
    swap (&lc[i], &lc[j]);
  dist[i] = dist[rc[i]] + 1;
  return i;
}



这还是左偏树吗?根本就不交换左右子树。。于是,被我一改,改成

int combine (int i, int j)
{
  if (key[j] > key[i])
    swap (&i, &j);
  if (!j) return i;
  rc[i] = combine (rc[i], j);
  if (dist[lc[i]] > dist[lc[j]])
    swap (&lc[i], &lc[j]);
  dist[i] = dist[rc[i]] + 1;
  return i;
}



一测,还是超了。发现,这次交换的是i的左孩子和j的左孩子,有用吗?

于是,又变成这副模样:

int combine (int i, int j)
{
  if (key[j] > key[i])
    swap (&i, &j);
  if (!j) return i;
  rc[i] = combine (rc[i], j);
  if (dist[lc[i]] > dist[rc[i]])
    swap (&lc[i], &rc[i]);
  dist[i] = dist[rc[i]] + 1;
  return i;
}

这样总可以了吧。。可是,还是超了。我看xqz写的都是斜堆,怎么比我的还快些呢?某一次,我把带//的两句删了,发现竟然过了。。好神奇,斜堆比左偏树快。。。

猛然之间,发现我写的竟然变成了右偏树。。。怎么会这样。。。于是,最终版本如下,终于过了:


int combine (int i, int j)
{
  if (key[j] > key[i])
    swap (&i, &j);
  if (!j) return i;
  rc[i] = combine (rc[i], j);
  if (dist[lc[i]] < dist[rc[i]])
    swap (&lc[i], &rc[i]);
  dist[i] = dist[rc[i]] + 1;
  return i;
}

昨天用ld的最大流的方法写省队集训day1的snake,写来写去最后就是错那么一个点。。好悲伤。。我静态查错查了好久,硬是没发现什么错误。我想,可能是增广不够吧,于是我在求了最大流之后随手又加了一句isap(),发现竟然过了!!好开心!!但到底是错在那个地方呢?我很怀疑是我的gap。把gap优化删了之后就过了,泪流满面。。

以后请注意,gap优化应该写成这个样子:

      else
        {
          --gap[dtmp = dist[i]]; /* DO NOT FORGET */
          e = adm[i] = edge[i];
          for (mindist = vexsize - 1; e; e = g[e].n)
            if (dist[g[e].t] < mindist && g[e].c)
              mindist = dist[g[e].t];
          ++gap[dist[i] = mindist + 1];
          if (!gap[dtmp]) break; /* DO NOT FORGET */
          if (i != src) i = pred[i];
        }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值