关于OIWiki上Splay的一点疑惑
  • 板块学术版
  • 楼主haooo
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/2/4 22:01
  • 上次更新2023/11/5 03:44:24
查看原帖
关于OIWiki上Splay的一点疑惑
67618
haooo楼主2021/2/4 22:01
void ins(int k) {
  if (!rt) {
    val[++tot] = k;
    cnt[tot]++;
    rt = tot;
    maintain(rt);
    return;
  }
  int cur = rt, f = 0;
  while (1) {
    if (val[cur] == k) {
      cnt[cur]++;
      maintain(cur);
      maintain(f);
      splay(cur);
      break;
    }
    f = cur;
    cur = ch[cur][val[cur] < k];
    if (!cur) {
      val[++tot] = k;
      cnt[tot]++;
      fa[tot] = f;
      ch[f][val[f] < k] = tot;
      maintain(tot);
      maintain(f);
      splay(tot);
      break;
    }
  }
}

为什么在那个while循环中只在最后一次时(if里面)调用了maintain(),而if外面未调用maintain()

注:

void maintain(int x) { sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + cnt[x]; }//sz:子树大小
2021/2/4 22:01
加载中...